Помогите кто знает. До этого я не писал на C++ диалоговое приложение. Есть программа на асме, я попробовал перевести с асма на С++, но возникла проблема. Не работают кнопки в окне. Не батоны, а кнопки сворачивания, закрытия. Код (Text): HWND hWnd; /*********************************************************************************** * Имя: WindowFunc * * * ***********************************************************************************/ LRESULT CALLBACK WindowFunc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { //--------------------------------------------------------------------------// //Локальные переменные //--------------------------------------------------------------------------// static HINSTANCE hinstance = GetModuleHandle(0); switch(message) { case WM_CREATE: break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,message,wParam,lParam); } return 0; } /*********************************************************************************** * Имя: Initialization * * * ***********************************************************************************/ int Initialization() { //--------------------------------------------------------------------------// //Локальные переменные char ProcessName[] = "Kybik"; //Имя процесса char WindowsName[] = "Kybik"; //Имя окна WNDCLASSEX wcl; //Структура для Win-окна HINSTANCE hinstance; //Хинстанс для окна //--------------------------------------------------------------------------// //Берём текущий хинстанс hinstance = GetModuleHandle(NULL); //Заполняем структуру для будущего окна wcl.hInstance=hinstance; wcl.lpszClassName=ProcessName; wcl.lpfnWndProc=(WNDPROC) WindowFunc; wcl.style=CS_HREDRAW | CS_VREDRAW; wcl.cbSize=sizeof(WNDCLASSEX); wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION); wcl.hIconSm=LoadIcon(NULL,IDI_WINLOGO); wcl.hCursor=LoadCursor(NULL,IDC_ARROW); wcl.lpszMenuName=NULL; wcl.cbClsExtra=0; wcl.cbWndExtra=DLGWINDOWEXTRA; wcl.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //Регистрируем наш класс if (!RegisterClassEx(&wcl)) { MessageBox(NULL,"Failed To Register The Window Class.","-ERROR-",MB_OK|MB_ICONEXCLAMATION); return 0; } //Создаём окно /*if (!(hWnd=CreateWindowEx( WS_EX_APPWINDOW | WS_EX_WINDOWEDGE, ProcessName, WindowsName, WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0, 800, 600, NULL, NULL, hinstance, NULL))) { MessageBox(NULL,"Window Creation Error.","-ERROR-",MB_OK|MB_ICONEXCLAMATION); return 0; }*/ hWnd = CreateDialogParam(hinstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,NULL,50); //hWnd = CreateDialogParam(hinstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)WindowFunc,50); return 1; } /*********************************************************************************** * Имя: WinMain * * * ***********************************************************************************/ int WINAPI WinMain( HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode) { //--------------------------------------------------------------------------// //Локальные переменные MSG msg; //Сообщения //--------------------------------------------------------------------------// if(!Initialization()) return 0; ShowWindow(hWnd,SW_SHOW); while (GetMessage(&msg,NULL,0,0)) { if(!IsDialogMessage(hWnd,&msg)) TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } Т.е. приложение создаётся, всё нормально работает, кроме кнопок. Заранее благодарю
Код (Text): HWND CreateDialogParam( HINSTANCE hInstance, // handle to application instance LPCTSTR lpTemplateName, // identifies dialog box template HWND hWndParent, // handle to owner window DLGPROC lpDialogFunc, // pointer to dialog box procedure LPARAM dwInitParam // initialization value ); lpDialogFunc у тебя установлен в NULL, а должен передаваться адрес процедуры обработки сообщений, кнопок. Код (Text): hWnd = CreateDialogParam(hinstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,NULL,50);
Код (Text): BOOL CALLBACK MainDlgProc (HWND hDlg, UINT uiMsg, WPARAM wp, LPARAM lp) { switch (uiMsg) { case WM_INITDIALOG: // Do whatever needed for WM_CREATE... break; case WM_COMMAND: // Any command or button click comes here break; default: return FALSE; // Message was not processed } return TRUE; // Message was processed } int WINAPI WinMain (HINSTANCE hInst, ...) { DialogBox (hInst, MAKEINTRESOURCE (IDD_DIALOG1), NULL, (DLGPROC) MainDlgProc); return 0; }
jCronuz Я так сделал потому что у меня есть асм код. Вот он Код (Text): invoke GetModuleHandle,0 mov hInstance,eax mov stWNDCLASSEX.cbSize,SIZEOF WNDCLASSEX mov stWNDCLASSEX.style, CS_HREDRAW or CS_VREDRAW mov stWNDCLASSEX.lpfnWndProc, OFFSET WindowProc mov stWNDCLASSEX.cbClsExtra,NULL mov stWNDCLASSEX.cbWndExtra,DLGWINDOWEXTRA push hInstance pop stWNDCLASSEX.hInstance mov stWNDCLASSEX.hbrBackground,COLOR_BTNFACE+1 mov stWNDCLASSEX.lpszMenuName, OFFSET strMenu mov stWNDCLASSEX.lpszClassName,OFFSET strClassName invoke LoadIcon,NULL,IDI_APPLICATION mov stWNDCLASSEX.hIcon,eax mov stWNDCLASSEX.hIconSm,eax invoke LoadCursor,NULL,IDC_CROSS mov stWNDCLASSEX.hCursor, eax ;*********************************************************************** ;Регистрируем класс и создаём окно ;*********************************************************************** invoke RegisterClassEx, addr stWNDCLASSEX invoke CreateDialogParam,hInstance,ADDR strWindowName,NULL,NULL,50 mov hDlg,eax И это работает. Кстати у Iczelion'а точно так же. Собственно я по нему и делал асм программу. AsmGuru62 Сделал как написано. Всё равно диалог работает, но не закрывается.
Я не привёл код обработчика для WM_COMMAND - естественно, надо ответить на это стандартным EndDialog(...). Можно также по ESC минимизировать диалог, вместо его закрытия (если это главное окно). При нажатии [Х] приходит WM_CLOSE, а при нажатии ESC - нет.
Всё получилось. Благодарю. Ещё один вопрос. Делаю List Control. Сделал column. Теперь пытаюсь впихнуть в этот лист какие то данные. У меня данные вставляются только почему то в первый column. Т.е. первый столбец заполняется, остальные нет. Посмотрел MSDN вроде всё тоже самое. Только там используют макрос ListView_InsertItem, но результата с ним тоже нет. Как мне заполнить остальные столбцы. Код (Text): lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvc.pszText = "1"; lvc.cx = 150; SendMessage(hList, LVM_INSERTCOLUMN, 0, (LPARAM)&lvc); lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; //lvc.fmt = LVCFMT_RIGHT; lvc.pszText = "2"; lvc.cx = 150; SendMessage(hList, LVM_INSERTCOLUMN, 1, (LPARAM)&lvc);, lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lvi.state = 0; lvi.stateMask = 0; lvi.pszText = "Текст1"; lvi.iSubItem = 0; lvi.iItem = 0; //lvi.lParam = (LPARAM) &rgPetInfo[1]; //lvi.pszText = LPSTR_TEXTCALLBACK; //SendMessage(hList, LVM_INSERTITEM,0, (LPARAM)&lvi); ListView_InsertItem(hList, &lvi); lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lvi.state = 0; lvi.stateMask = 0; lvi.pszText = "Текст2"; lvi.iSubItem = 0; lvi.iItem = 0; //lvi.puColumns = 1; //lvi.lParam = (LPARAM) &rgPetInfo[1]; //lvi.pszText = LPSTR_TEXTCALLBACK; //SendMessage(hList, LVM_INSERTITEM,0, (LPARAM)&lvi); ListView_InsertItem(hList, &lvi);
LVM_INSERTITEM для добавления новой строки в ListView. Для изменения текста в колонках нужен LVM_SETITEMTEXT.
LVM_INSERTITEM добавляет новый итем и устанавливает текст первой колонки. Для второй и последующих колонок добавление текста производится через LVM_SETITEM. Или же использовать макрос ListView_SetItemText.