K
secondsun@gmx.de schrieb:
würde ich auch gerne meine steuerelemente während der laufzeit dynmaisch erstellen.
Da habe ich zufällig was vorbereitet...
#include <windows.h>
#include <stdio.h>
HINSTANCE hInstGlobal;
int useparms(int a, ...)
{
return a;
}
char *fbprint(char *format, ...)
{
static char buf[160];
vsprintf(buf, format, (&format)+1);
return (char *)buf;
}
long TextOutStr(HDC hdc, int x, int y, char *s)
{
return TextOut(hdc, x, y, s, strlen(s));
}
int ReturnValue = 19;
char templ[1000];
char *Even4(char *s)
{
unsigned long l;
l = (long)s;
l = (l+3)&~3;
return (char *)l;
}
char *CopyWide(short *dest, char *src)
{
do
*dest++ = *src;
while(*src++);
return (char *)dest;
}
char *CopyShort(short *dest, unsigned short value)
{
*dest++ = value;
return (char *)dest;
}
/* ============================== */
/* Template im Speicher erstellen */
/* ============================== */
void CreatTempl(void)
{
DLGTEMPLATE *dlgt;
DLGITEMTEMPLATE *dlgit;
char *s;
dlgt = (DLGTEMPLATE *)templ;
dlgt->style = WS_SYSMENU;
dlgt->dwExtendedStyle = 0;
dlgt->cdit = 1; /* Es folgt 1 Item-Struktur */
dlgt->x = 10;
dlgt->y = 10;
dlgt->cx = 200;
dlgt->cy = 200;
s = (char *)(dlgt+1);
s += 2;/* menu */
s += 2;/* class */
/*s += 2;*//* title */
s = CopyWide((short *)s, "Schweine im Weltall");
dlgit = (DLGITEMTEMPLATE *)Even4(s); /* Vor Item Adresse bündig machen */
dlgit->style = WS_CHILD | WS_VISIBLE;
dlgit->dwExtendedStyle = 0;
dlgit->x = 10;
dlgit->y = 10;
dlgit->cx = 40;
dlgit->cy = 40;
dlgit->id = 20;
s = (char *)(dlgit+1);
/*s += 2;*//* class */
/*s = CopyWide((short *)s, "button");*/
s = CopyShort((short *)s, 0xFFFF), /* Entspricht */
s = CopyShort((short *)s, 0x0082); /* "button" */
/*s += 2;*//* title */
s = CopyWide((short *)s, "OK");
s += 2;/* dsize */
/* itemdaten beginnen ebenfalls mit align4 */
/* hier würde nächstes Item folgen */
}
int _stdcall dialogproc(HWND hwnd, unsigned int message,
unsigned int wParam, long lParam)
{
switch(message)
{ case WM_INITDIALOG:
return 1;
case WM_KEYDOWN:
EndDialog(hwnd, 28);
return 1;
case WM_COMMAND:
EndDialog(hwnd, 30);
return 1;
}
useparms(0, wParam, lParam);
return 0;
}
void DoDialogBox(HWND hwnd)
{
CreatTempl();
ReturnValue = DialogBoxIndirectParam(hInstGlobal,
(DLGTEMPLATE *)templ, hwnd, dialogproc, 0);
}
long _stdcall WndProc(HWND hwnd, unsigned int message, unsigned int wParam,
long lParam)
{
HDC hdc;
PAINTSTRUCT ps;
int KEYDOWN_nVirtKey;
switch(message)
{ case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
TextOutStr(hdc, 10, 10, fbprint("ReturnValue %i", ReturnValue));
EndPaint(hwnd, &ps);
return 0;
case WM_KEYDOWN:
KEYDOWN_nVirtKey = wParam;
if (KEYDOWN_nVirtKey == VK_RETURN)
{ DoDialogBox(hwnd);
InvalidateRect(hwnd, 0, TRUE);
UpdateWindow(hwnd);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
int _stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
char *szCmdLine, int iCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wc;
char *cln = "mbclass";
hInstGlobal = hInstance;
memset(&wc, 0, sizeof(WNDCLASS));
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(0, IDI_INFORMATION);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszClassName = cln;
RegisterClass(&wc);
hwnd = CreateWindow(cln, "Titel", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
0, 0, hInstance, 0);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
useparms(0, hPrevInstance, szCmdLine);
while(GetMessage(&msg, 0, 0, 0))
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}