M
Erstmal Danke.
Ich hab jetzt alles geändert und die Klasse funktioniert soweit erst einmal.
Jetzt will ich aber für jedes Element ein Editfenster erzeugen und hab auch wieder einen Pointer auf das Handle gelegt und versucht mit new zu allokieren.
Allerdings stürzt dann das Programm ab, wenn ich damit arbeite (zumindest nur manchmal, wenn ich grad neugestartet habe nicht). Außerdem stürzt das Programm auch ab, wenn ich es schließe. Hat jemand eine Idee, was ich da falsch gemacht habe.
Ich schicke mal meine Main.cpp:
# include <windows.h>
# include <iostream.h>
# include "matrix.h"
TCHAR szAppName[] = TEXT("Matrizen");
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int iCmdShow)
{
HWND hwnd;
WNDCLASS wndclass;
MSG msg;
wndclass.style = CS_HREDRAW| CS_VREDRAW;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.lpfnWndProc = WndProc;
wndclass.hInstance = hInstance;
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.lpszMenuName = (NULL);
wndclass.lpszClassName = szAppName;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
if(!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("Fehler: Programm setzt Unicode voraus."), szAppName, MB_ICONERROR);
return 0;
};
hwnd = CreateWindow (szAppName,
szAppName,
WS_CAPTION | WS_THICKFRAME | WS_OVERLAPPED |
WS_MINIMIZEBOX | WS_SYSMENU,
100,
100,
500,
500,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
};
return msg.wParam;
};
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HWND hEditM, hEditN, hButtonCreate, hGroupAdd;
HWND *hEditElements;
HDC hdc;
PAINTSTRUCT ps;
//matrix *mat;
int ctr=0;
int m, n, i, j;
switch(message){
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 50, 35, TEXT("Dimension:"),10);
TextOut(hdc, 215, 35, TEXT("x"), 1);
EndPaint(hwnd, &ps);
return 0;
case WM_CREATE:
hButtonCreate = CreateWindow (TEXT("button"),
TEXT("Matrix erstellen"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
330, 30, 130, 30,
hwnd, NULL,
((LPCREATESTRUCT) lParam)->hInstance, NULL);
hGroupAdd = CreateWindow (TEXT("button"),
TEXT("Neue Matrix hinzufügen"),
WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
20, 10, 460, 60,
hwnd, NULL,
((LPCREATESTRUCT) lParam)->hInstance, NULL);
hEditM = CreateWindow (TEXT("edit"), NULL, WS_CHILD | WS_BORDER |
WS_VISIBLE | ES_CENTER, 150, 35, 40, 20, hwnd, NULL,
((LPCREATESTRUCT) lParam)->hInstance, NULL);
hEditN = CreateWindow (TEXT("edit"), NULL, WS_CHILD | WS_BORDER |
WS_VISIBLE | ES_CENTER, 250, 35, 40, 20, hwnd, NULL,
((LPCREATESTRUCT) lParam)->hInstance, NULL);
return 0;
case WM_DESTROY:
delete[] hEditElements;
PostQuitMessage (0);
return 0;
case WM_COMMAND:
if(LOWORD(wParam)==GetWindowLong (hButtonCreate, GWL_ID) &&
HIWORD(wParam)==BN_CLICKED)
{
//Hier kommt der Fehler
ctr++;
m=3;//hEditM
n=3;//hEditN
hEditElements = new HWND[m*n];
MessageBox(hwnd, TEXT("Bis hierhin geht das noch"), szAppName, NULL);
for(i=0;i<=m-1;i++){
for(j=0;j<=n-1;j++)
{ hEditElements[i*n+j] = CreateWindow
("edit",
NULL,
WS_CHILD | WS_BORDER | ES_CENTER | WS_VISIBLE,
20+80*i, 180+30*j, 70, 20,
hwnd, NULL,
((LPCREATESTRUCT) lParam)->hInstance, NULL);
};
};
};
return 0;
case WM_CLOSE:
delete []hEditElements;
return 0;
};
return DefWindowProc(hwnd, message, wParam, lParam);
};
Geht sowas mit dem Datentyp HWND nicht?
Ist es eine Fehlerbedingung wenn ich ein Feld deallokiere, wenn er nicht einmal allokiert ist?
Bitte helft mir.
Gruß
Max