Hallo,
ich bin gerade dabei etwas mit der WinAPI und Fenstergestaltung ohne zusätzliche Grafikbibliotheken zu experimentieren. Soweit funktioniert auch alles, nur das Erstellen von Childfenstern aus Dialogresourcen, die mit dem Dialog Designer von Visual Studio erstellt wurden, bereitet mir Probleme. Wenn ich ein Childfenster erstelle und als Klassenname den Namen angebe, den ich dem Dialogfeld im Resourceneditor gegeben habe, wird auch ein Childfenster erstellt, jedoch werden keine Steuerelemente erstellt. Andere Eigenschaften, die ich im Resourceneditor angegben habe, werden auch ignoriert. Ich habe die Vermutung, dass ich die Dialogresource noch irgendwie laden muss, damit die WinAPI auch alle Steuerelemente der Resource erstellt.
Hier die relevanten Codeausschnitte:
|
C-/C++-Quelltext
|
1
2
3
4
5
|
// Child-Hauptdialog anzeigen (hWnd ist Handle auf Parent-Window)
hMainDlg = CreateWindow("MainWindowDlg", "MainWindowDlg", WS_CHILDWINDOW | WS_OVERLAPPEDWINDOW, IMAGE_WIDTH + 10, 0, CW_USEDEFAULT, 0, hWnd, NULL, hInstance, NULL);
ShowWindow(hMainDlg, SW_SHOWNORMAL);
UpdateWindow(hMainDlg);
InvalidateRect(hMainDlg, NULL, true);
|
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
// Registriert die Fensterklasse
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WEBCAMTEST));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WEBCAMTEST);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
ATOM r = RegisterClassEx(&wcex); // Parent-Window Fensterklasse registrieren
wcex.lpfnWndProc = MainDlgProc;
wcex.hIcon = 0;
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "MainWindowDlg";
RegisterClassEx(&wcex); // Child-Window Fensterklasse registrieren
return r;
}
|
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
// Verarbeitet Meldungen vom Child-Dialogfenster.
LRESULT CALLBACK MainDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
switch (message)
{
case WM_CREATE:
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)
{
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
// TODO: Hier den Zeichnungscode hinzufügen.
Draw(hWnd);
break;
case WM_MOVE:
case WM_SIZE:
InvalidateRect(hWnd, NULL, true);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
|
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// zeichnet den Inhalt des Fensters
void Draw(HWND hWnd)
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
RECT rect;
rect.top = IMAGE_HEIGHT + 20;
rect.left = 0;
rect.right = IMAGE_WIDTH;
rect.bottom = IMAGE_HEIGHT + 100;
DrawText(hdc, acDriverInfo, strlen(acDriverInfo), &rect, DT_LEFT);
EndPaint(hWnd, &ps);
}
|
Hat jemand eine Idee, warum das Childfenster nicht nach Vorgaben der Dialogresource erstellt wird?
Grüße
BurningWave