Avatar billede karlkoder Nybegynder
04. juni 2001 - 12:09 Der er 15 kommentarer og
1 løsning

OPBYGNING I WIN32

Okay..
Jeg har før fået lavet mig en dialogbox med knapper osv., men meget af koden var noget jeg havde fundet frem til ved at kigge i en andens kode. (jeg vidste simpelthen ikke hvor jeg ellers skulle lede efter de pågældende funktioner osv.)

Nu har jeg fået lidt mere tjeck på det og kunne nu godt tænke mig at opbygge min dialogbox med knapper osv. uden brug af EDITOREN i VC++.
Jeg går ud fra at alle \'controls\' som oprettes som selvstændige windows ikke ??
og at selve applicationen skal starte op som et parent-window...
dette gøres ved hjælp af: CreateWindowEx(..) ikke ??

er der nogen der gider/kan hjælpe mig ??

Avatar billede karlkoder Nybegynder
04. juni 2001 - 12:17 #1
Undskyld...!    =(

Glemte lige at skrive at det skal være i
REN WIN32 API

Avatar billede rasmusneckelmann Nybegynder
05. juni 2001 - 22:36 #2
JO alle disse dimser er selvstændige windows som du selv påpeger, og knapper (og den slags) skal have hovedvinduet som parent.
De mange standard ting som knapper/ikoner/lister mm er indbygget som \"Common Controls\" (der er en liste over dem i MSDN). (Du skal altså bare bruge \"control\"\'ens navn som WindowClass for dit vindue).
Alt dette er MEGET grundigt beskrevet i MSDN.
----
Dog kan jeg ikke forstå hvorfor du vil gøre dette uden at bruge dialog-editoren? Umiddelbart kan jeg ikke se noget smart ved det. Jo, måske i nogle tilfælde hvor indholdet af dialogen er dynamiskt, men det er jo sjældent.
Avatar billede karlkoder Nybegynder
05. juni 2001 - 23:55 #3
grunden er at jeg vil kunne disse ting sådan på et rimeligt niveau. Også gerne i dynamisk øjemed.

Men altså jeg laver alle disse controls som selvstændige vinduer ovenpå et parent vindue ??

Avatar billede psp_psp Nybegynder
06. juni 2001 - 11:42 #4
Det er ret nemt og kan være nyttigt hvis du vil lave en dynamisk gui.
1)  Først registrerer og viser du et almindeligt vindue (a la \"Hello Windows\")
2)  Under WM_CREATE laver du dine kontroller ved hjælp af CreateWindow eller CreateWindowEx.

Eksempel:
hButton = CreateWindow(\"BUTTON\", \"Click me!\", BS_PUSHBUTTON, 5, 5, 100, 14, hwnd, NULL, hInst, NULL);

mvh
Peter
Avatar billede psp_psp Nybegynder
06. juni 2001 - 11:45 #5
Ubs!
Jeg tror det skal være

#define IDC_BUTTON 100  //Button ID
...
hButton = CreateWindow(\"BUTTON\", \"Click me!\", BS_PUSHBUTTON, 5, 5, 100, 14, hwnd, IDC_BUTTON, hInst, NULL);

Avatar billede borrisholt Novice
06. juni 2001 - 13:33 #6
Jeg har rodet lidt med WIN32 programmering. Jeg har laver et eksempel der viser hvordan du opretter et alm vindue, og sætter en kontrol på den samt bruger den. Eksemplet kan rekvireres på Jens@Borrisholt.com

Jens B
Avatar billede karlkoder Nybegynder
08. juni 2001 - 08:24 #7
Hvad hvis man ønsker at hoppe til en ny dialogbox via et tryk på en knap...??
skal denne nye dialogbox så også registreres ??

Avatar billede psp_psp Nybegynder
08. juni 2001 - 10:00 #8
Ja, den skal også registreres som et selvstændigt vindue. Nu syntes jeg du er på vej ud i noget hvor det er spild af tid ikke at bruge resource-editoren! På den anden side: du lærer sikkert også meget af det :)

Peter
Avatar billede karlkoder Nybegynder
08. juni 2001 - 12:24 #9
Peter >> skal denne nye så registreres som et child ??

Hvordan kalder man dette vindue fra det andet ?
Avatar billede borrisholt Novice
08. juni 2001 - 12:34 #10
karlkoder>> Hvad med det jeg sendte kan det ikke bruges ?

Jens B
Avatar billede psp_psp Nybegynder
08. juni 2001 - 14:24 #11
Her er et eksempel:
#include \"stdafx.h\"

HINSTANCE hInst;                               
#define IDC_BUTTON 100

LRESULT CALLBACK    WndProc1(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    WndProc2(HWND, UINT, WPARAM, LPARAM);

char *szTitle = \"Test\", *szMsgClass1 = \"msgClass1\", *szMsgClass2 = \"msgClass2\";

int APIENTRY WinMain(HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR    lpCmdLine,
                    int      nCmdShow)
{

    MSG msg;
    WNDCLASSEX wcex;
    HWND hWnd;

    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style            = CS_HREDRAW | CS_VREDRAW;
    wcex.cbClsExtra        = 0;
    wcex.cbWndExtra        = 0;
    wcex.hInstance        = hInstance;
    wcex.hIcon            = NULL;
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    = (HBRUSH)COLOR_WINDOW;
    wcex.lpszMenuName    = NULL;
    wcex.hIconSm        = NULL;

    wcex.lpfnWndProc    = (WNDPROC)WndProc1;
    wcex.lpszClassName    = szMsgClass1;
    RegisterClassEx(&wcex);

    wcex.lpfnWndProc    = (WNDPROC)WndProc2;
    wcex.lpszClassName    = szMsgClass2;
    RegisterClassEx(&wcex);
   
    hInst = hInstance;

    hWnd = CreateWindow(szMsgClass1, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}


LRESULT CALLBACK WndProc1(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HWND hWnd2;
    static HWND hButton;

    switch (message)
    {
        case WM_CREATE:
            hButton = CreateWindow(\"BUTTON\", \"Click me!\", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 5, 5, 100, 20, hWnd, (HMENU)IDC_BUTTON, hInst, NULL);           
            break;

        case WM_COMMAND:

            switch (LOWORD(wParam))
            {
                case IDC_BUTTON:
                    hWnd2 = CreateWindow(szMsgClass2, \"Vindue nr 2\", WS_CHILD | WS_VISIBLE | WS_SYSMENU | WS_CAPTION,
                    30,30, 200, 200, hWnd, NULL, hInst, NULL);
                  break;
                default:
                  return DefWindowProc(hWnd, message, wParam, lParam);
            }
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
  }
  return 0;
}

LRESULT CALLBACK WndProc2(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {   
        case WM_DESTROY:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
  }
  return 0;
}
Avatar billede karlkoder Nybegynder
11. juni 2001 - 10:55 #12
Peter >> jeg har lagt koden ind VC++ og kørt den.
Nul compiler-fejl og den starter fint.
Når man trykker på knappen kommer der et nyt vindue frem efter hensigten. Men når man lukker dette nye vindue går programmet ned...    =(

Hvorfor ??
Avatar billede psp_psp Nybegynder
11. juni 2001 - 12:27 #13
Det var da underligt! Jeg har ikke det problem.
Du kan prøve at sende dit projekt til mig på psp@dst.dk

Peter
Avatar billede karlkoder Nybegynder
11. juni 2001 - 13:36 #14
Peter >> er sendt !
Avatar billede karlkoder Nybegynder
12. juni 2001 - 10:14 #15
Peter >> den kode går kun ned når at knappen har været aktiveret...

Avatar billede karlkoder Nybegynder
22. juli 2001 - 10:26 #16
lukker spørgsmålet..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester