Kłopot z textboxami, zakladkami i skalowaniem oraz GetWindowText.

0

Cześć jestem dosyć świeży w programowaniu. Mam do zrobienia program i napotkałem parę problemów po drodze.

  1. Mam problem z linkowaniem, nie mogę wrzucić linka do okna, próbowałem tak:
#define WC_LINK "SysLink"   HWND hSysLink = CreateWindow(WC_LINK,"<A HREF=\"http://interia.pl\">Interia</A>",WS_VISIBLE|WS_CHILD,10,10,100,20,hwnd4,(HMENU)0,*hInst,NULL) 
  1. Mam 3 zakładki i w która nie kliknę to pokazuje to samo, czyli wszystko co mam w programie zawarte, textboxy, buttony itd. Jak to rozdzielić?
  2. Mam dwa textboxy i chciałbym aby do obu dało się wpisać tylko liczbę, w jednym zmiennoprzecinkową. Chciałbym aby podane te 2 liczby do textboxów się pomnożyły i żebym wynik dostał w messageboxie. Wiem, że jest to związane z GetWindowText, ale kompletnie się pogubiłem.
  3. Skalowanie okna, znalazłem o tym parę tematów, jakieś parametry itp, ale dalej się rozjeżdża i trzeba 'ręcznie', myszką dostosować okno.
    W razie czego mogę wrzucić wszystko co mam do tej pory. Bardzo bym prosił o jakieś wskazówki, naprowadzenia:)
0

Nie podpowiem pod kątem C++. Ale pod WinAPI piszę w Delphi.

  1. A nie lepiej zrobić linka jako label z odpowiednią zmianą kolorów i kursora poprzez kod w funkcji obsługi komunikatów okna/dialogu. Oraz dodatkowo by klik coś robił, obsłużyć go poprzez ShellExecute w obsłudze komunikatu WM_COMMAND?

  2. Z zakładkami mam małę doświadczenie. To pewnie ktoś inny się wypowie.

  3. Pobierasz tekst z kontrolek, konwertujesz go na int albo też float. I wykonujesz działanie. Potem znowu konwertujesz na tekst i ustawisz poprzez komunikat WM_SETTEXT. Jakie mechanizmy do tego słuzą to już sam pod kątem C++ wygoogluj.

  4. Najlepiej zrobić sobie, jeśli to prosty program, dialog zamiast okna. Świetnie do edycji okien dialogowych umieszczonych później w zasobach nadaje się ten edytor dostepny na: http://www.assembly.com.br/resed/index.html - osobiście polecam.

0

możesz rozwinąć pkt 1? Może jakiś poradnik jest o tym? Co do pkt. 3 to co jest moim identyfikatorem kontrolki?

/*TEKSTBOX*/
      hText = CreateWindowEx
    (WS_EX_CLIENTEDGE, "EDIT"
     , NULL, WS_CHILD | WS_VISIBLE | WS_BORDER,
     5, 200, 150, 20, hWnd, NULL, hInstance, NULL);
CWnd::GetDlgItemText(int IDC_hText, CharAr, int sizeof(CharAr));
GetDlgItemText(HWND hWnd, int IDC_hText, CharAr, int sizeof(CharAr));
0

nie mogę wrzucić linka do okna, próbowałem tak

Nie możesz bo?
ZAWSZE podajemy co się złego dzieje.

SysLink nie otwiera automatycznie strony podanej w URL-u, tylko wysyła WM_NOTIFY do okna rodzica.

0
CzasNastal napisał(a):

możesz rozwinąć pkt 1? Może jakiś poradnik jest o tym? Co do pkt. 3 to co jest moim identyfikatorem kontrolki?

Nie wiem czy są tutoriale. Ja pod Delphi robię tak. W pliku *.rc wkompilowanym do zasobów mam na przykład linijki opisujące kontrolkę na dialogu:

#define IDC_WEBADDRESSLABEL 115
// ciach...
  CONTROL "HTTP://OLESIO.EU", IDC_WEBADDRESSLABEL, "Static", WS_CHILDWINDOW | WS_VISIBLE | SS_NOTIFY, 336, 160, 66, 8

A w kodzie:

//...
const
//...
  IDC_WEBADDRESSLABEL = 115;
//...
function LabelsProc(AHwnd : HWND; Msg : UINT; AWParam : WParam; ALParam : LParam) : integer; stdcall;
begin
  case Msg of
    wM_SETCURSOR :
      begin
        if IsWindowEnabled(AHwnd) then
        begin
          SetCursor(LoadCursor(0, IDC_HAND));
          Result := 0;
          Exit;
        end;
      end;
  end;
  Result := CallWindowProc(POldLabelsProc, AHwnd, Msg, AWParam, ALParam);
end;
//...
// W funkcji obsługi komunikatów dialogu:
//...
  case Msg of
    WM_INITDIALOG :
      begin
//...
        WebAddressLabelHandle := GetDlgItem(AHWnd, IDC_WEBADDRESSLABEL);
        PNewLabelsProc := @LabelsProc;
        POldLabelsProc := Pointer(SetWindowLong(WebAddressLabelHandle, GWL_WNDPROC, Integer(PNewLabelsProc)));
        Fnt := CreateFont(-8, 0, 0, 0,
          FW_NORMAL, 0, 1, 0, ANSI_CHARSET,
          OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
          DEFAULT_QUALITY, VARIABLE_PITCH or FF_SWISS, 'MS Sans Serif');
        SendMessage(WebAddressLabelHandle, WM_SETFONT, Fnt, 1);
    WM_COMMAND :
      begin
//...
        if (LoWord(WParam) = IDC_WEBADDRESSLABEL) then
        begin
          ShellExecute(MainDialogHandle, 'open', PChar(AnsiLowerCase(GetText(GetDlgItem(AHwnd, LoWord(WParam))))), nil, nil, SW_SHOW);
        end;
      end;
    WM_CTLCOLORSTATIC :
      begin
        case GetDlgCtrlId(LParam) of
          IDC_WEBADDRESSLABEL :
            begin
              DC := WParam;
              SetTextColor(DC, RGB(0, 0, 255));
              SetBKColor(DC, GetSysColor(COLOR_BTNFACE));
              Result := GetStockObject(HOLLOW_BRUSH);
            end;
        end;
      end;
//...

Wygląd:
schowek01.png
Mam nadzieję, że te wycinki naprowadzą Ciebie jak to można zrobic w C++.

1 użytkowników online, w tym zalogowanych: 0, gości: 1