Все привет. Возник вопрос по программке в WinAPI. Пример на создание немодального окна, 3 кнопки, статик, и 3 контрола, на диалоге, диалог вызываетс при левом щелчке мыши, при правом исчезает. Диалог создается при помощи CreateWindow. Скомпилил, но когда щелкаю левой кнопкой сам диалог не появляется. Подскажите пожалуйста в чем проблема. Код (Text): #include <windows.h> #include "CreateDlg.h" #define ID_STATIC 2000 #define ID_BUTTON1 2000 #define ID_BUTTON2 2001 #define ID_BUTTON3 2003 #define ID_HELP 2004 BOOL RegClass(WNDPROC, LPCTSTR, UINT); LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM); HWND CreateDlg(HWND, WORD*); HINSTANCE hInst; char szClassName[]="WindowAppClass"; //Главная функция int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { HWND hwnd; MSG msg; hInst=hInstance; if (!RegClass(WndProc, szClassName, COLOR_DESKTOP)) return FALSE; int wScreen=GetSystemMetrics(SM_CXSCREEN); int hScreen=GetSystemMetrics(SM_CYSCREEN); hwnd = CreateWindow(szClassName, "Первое приложения. Диалог", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, wScreen, hScreen, 0, 0, hInstance, NULL); if (!hwnd) return FALSE; while (GetMessage(&msg, 0, 0, 0)) {TranslateMessage(&msg); DispatchMessage(&msg);} return msg.wParam; } //Функция регистрации класса BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground) { WNDCLASS w; w.style = CS_HREDRAW | CS_VREDRAW; w.lpfnWndProc = Proc; w.cbClsExtra = w.cbWndExtra = 0; w.hInstance = hInst; w.hIcon = LoadIcon(NULL, IDI_APPLICATION); w.hCursor = LoadCursor(NULL, IDC_ARROW); w.hbrBackground = (HBRUSH)(brBackground + 1); w.lpszMenuName = (LPCTSTR)NULL; w.lpszClassName = szName; return RegisterClass(&w); } //Фуккция окна LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static WORD *pdlgtemplate; static HWND hdlg; switch (msg) { case WM_CREATE: { pdlgtemplate=(PWORD)LocalAlloc(LPTR,2000); hdlg = CreateDlg(hwnd, pdlgtemplate); return 0; } case WM_LBUTTONDOWN: {ShowWindow(hdlg,SW_SHOWNORMAL); return 0;} case WM_RBUTTONDOWN: {ShowWindow(hdlg,SW_HIDE); return 0;} case WM_DESTROY: { DestroyWindow(hdlg); LocalFree(LocalHandle(pdlgtemplate)); PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd, msg, wParam, lParam); } HWND CreateDlg(HWND hwnd, WORD *pdlgtemplate) { char const caption[]= " Изменение режима работы приложения"; char const stattxt[]= "Сейчас следует:"; char const modeoff[]= "завершить работу приложения"; char const modedat[]= "перезагрузить данные"; char const modepsw[]= "сменить имя пользователя"; WORD *p; p=pdlgtemplate; int cxChar, cyChar; { TEXTMETRIC tm; HDC hdc; hdc = GetDC(hwnd); GetTextMetrics(hdc, &tm); ReleaseDC(hwnd, hdc); cxChar = tm.tmAveCharWidth+1; cyChar = tm.tmHeight + tm.tmExternalLeading; } DWORD dlgunit = GetDialogBaseUnits(); int dlgwunit = LOWORD(dlgunit); int dlghunit = HIWORD(dlgunit); cxChar = cxChar*4/dlgwunit; cyChar = cyChar*8/dlghunit; int wDlg, hDlg, wItem, hItem, left, top; DWORD lStyle = DS_CENTER | DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION; wDlg = lstrlen(caption)*cxChar; hDlg = cyChar*10; DlgTemplate(p, lStyle, 7, 0, 0, wDlg, hDlg, (LPSTR)caption); //1 hItem = cyChar; top=left=hItem/2; hItem+=left; wItem = (wDlg-left-left); lStyle = WS_CHILD | WS_VISIBLE | BS_GROUPBOX | WS_TABSTOP; DlgItemTemplate(p, lStyle, left, top, wItem, 4*hItem+left, ID_STATIC, (LPSTR)"button", (LPSTR)stattxt); //2 wItem = lstrlen(modeoff)*cxChar+10; top+=hItem; lStyle = BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP; DlgItemTemplate(p, lStyle, hItem, top, wItem, hItem, ID_BUTTON1, (LPSTR)"button", (LPSTR)modeoff); //3 wItem = lstrlen(modedat)*cxChar+10; top+=hItem; lStyle = BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE; DlgItemTemplate(p, lStyle, hItem, top, wItem, hItem, ID_BUTTON2, (LPSTR)"button", (LPSTR)modedat); //4 wItem = lstrlen(modepsw)*cxChar+10; top+=hItem; lStyle = BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE; DlgItemTemplate(p, lStyle, hItem, top, wItem, hItem, ID_BUTTON3, (LPSTR)"button", (LPSTR)modepsw); //5 wItem = (wDlg-left-left-hItem-hItem)/3; top+=hItem+hItem/2+left; lStyle = BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP; DlgItemTemplate(p, lStyle, left, top, wItem, hItem, IDOK, (LPSTR)"button", (LPSTR)"Да"); //6 lStyle = BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP; DlgItemTemplate(p, lStyle, left+wItem+hItem, top, wItem, hItem, IDCANCEL, (LPSTR)"button", (LPSTR)"Отмена"); //7 DlgItemTemplate(p, lStyle, left+wItem+hItem+wItem+hItem, top, wItem, hItem, ID_HELP, (LPSTR)"button", (LPSTR)"Справка"); //***** HWND hdlg; hdlg = CreateDialogIndirect (hInst, (LPDLGTEMPLATE)pdlgtemplate, hwnd, (DLGPROC)DlgProc); return hdlg; } LRESULT CALLBACK DlgProc (HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_COMMAND: { switch (LOWORD(wParam)) { case IDOK: case IDCANCEL: { EndDialog(hdlg, TRUE); return TRUE; } } } } return FALSE; } CreateDlg.h Код (Text): LPWORD lpwAlign(LPWORD); int nCopyAnsiToWideChar(LPWORD, LPSTR); void DlgTemplate(PWORD& p, DWORD lStyle, int items, int x, int y, int cx, int cy, LPSTR txt); void DlgItemTemplate(PWORD& p, DWORD lStyle, int x, int y, int cx, int cy, WORD id, LPSTR classname, LPSTR txt); LPWORD lpwAlign(LPWORD lpln) { ULONG ul=(ULONG)lpln; ul+=3; ul>>=2; ul<<=2; return (LPWORD)ul; } int nCopyAnsiToWideChar(LPWORD lpWCStr, LPSTR lpAnsiln) { int cchAnsi=lstrlen(lpAnsiln); return MultiByteToWideChar(GetACP(), MB_PRECOMPOSED, lpAnsiln, cchAnsi, lpWCStr, cchAnsi) + 1; } void DlgTemplate(PWORD& p, DWORD lStyle, int items, int x, int y, int cx, int cy, LPSTR txt) { *p++=LOWORD(lStyle); *p++=HIWORD(lStyle); *p++=0; *p++=0; *p++=items; *p++=x; *p++=y; *p++=cx; *p++=cy; *p++=0; *p++=0; int nchar=nCopyAnsiToWideChar(p,TEXT(txt)); *p++=nchar; p=lpwAlign((LPWORD)p); } void DlgItemTemplate(PWORD& p, DWORD lStyle, int x, int y, int cx, int cy, WORD id, LPSTR classname, LPSTR txt) { *p++=LOWORD(lStyle); *p++=HIWORD(lStyle); *p++=0; *p++=0; *p++=x; *p++=y; *p++=cx; *p++=cy; *p++=id; int nchar=nCopyAnsiToWideChar(p,TEXT(classname)); p+=nchar; if(lstrlen(txt)>0) nchar=nCopyAnsiToWideChar(p, TEXT(txt)); else nchar=nCopyAnsiToWideChar(p, TEXT("")); p+=nchar; p+=0; p=lpwAlign((LPWORD)p); }