Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.188.148.71] |
|
Страницы: (4) 1 2 [3] 4 все ( Перейти к последнему сообщению ) |
Сообщ.
#31
,
|
|
|
Цитата tumanovalex @ Однако если в последнем операторе return CALLBACK DlgProc вместо FALSE указать TRUE, программа зависает. Почему так происходит? Потому что возвращая TRUE ты блокируешь стандартную обработку для любых сообщений, поступающих в диалог. Цитата MSDN Typically, the dialog box procedure should return TRUE if it processed the message, and FALSE if it did not. If the dialog box procedure returns FALSE, the dialog manager performs the default dialog operation in response to the message. Цитата tumanovalex @ 2. Как определить хендл основного диалога для указания его в CreateDialog второго диалога? Его возвращает функция CreateDialog. Цитата tumanovalex @ 3. Попробовал размер диалога с кнопками уменьшить до размера кнопок - не получилось. Можно ли это сделать? А то размер второго диалога, гораздо больший размера кнопок, может наложиться на другие контролы основного диалога. Диалог может быть любого размера. Даже нулевого. Но не стоит так делать. Что и где не получилось в плане размера? VC++ 12 -> Win32 empty project #include "stdafx.h" static HWND hWnd; int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPWSTR lpCmdLine, int nCmdShow) { MSG Msg; WNDCLASSEX WCEX = {0}; WCEX.cbSize = sizeof(WNDCLASSEX); WCEX.lpfnWndProc = MainWndProc; WCEX.hInstance = hInstance; WCEX.hCursor = LoadCursor(NULL, IDC_ARROW); WCEX.hbrBackground = GetSysColorBrush(COLOR_BTNFACE); WCEX.lpszClassName = L"MyWndClass"; if(!RegisterClassEx(&WCEX)) return 0; hWnd = CreateWindowEx(0, WCEX.lpszClassName, NULL, WS_OVERLAPPEDWINDOW | WS_MAXIMIZE | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 512, 512, NULL, NULL, hInstance, NULL); //message-loop return 0; } |
Сообщ.
#32
,
|
|
|
Цитата B.V. @ VC++ 12 -> Win32 empty project Нет, не работает. VS2008 -> Win32 empty project // -------------------------------------------------------------------------- #include "stdafx.h" //#include <mmsystem.h> //#include <commctrl.h> // -------------------------------------------------------------------------- //#pragma comment(lib,"winmm.lib") //#pragma comment(lib,"comctl32.lib") // -------------------------------------------------------------------------- LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; static HWND hWnd; // -------------------------------------------------------------------------- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR , int iCmdShow) { MSG Msg; WNDCLASSEX WCEX = {0}; WCEX.cbSize = sizeof(WNDCLASSEX); WCEX.lpfnWndProc = WndProc; WCEX.hInstance = hInstance; WCEX.hCursor = LoadCursor(NULL, IDC_ARROW); WCEX.hbrBackground = GetSysColorBrush(COLOR_BTNFACE); WCEX.lpszClassName = L"MyWndClass"; if(!RegisterClassEx(&WCEX)) return 0; hWnd = CreateWindowEx(0, WCEX.lpszClassName, NULL, WS_OVERLAPPEDWINDOW | WS_MAXIMIZE | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 512, 512, NULL, NULL, hInstance, NULL); while(::GetMessage (&Msg, NULL, 0, 0)) { ::TranslateMessage (&Msg) ; ::DispatchMessage (&Msg) ; } return Msg.wParam ; } // -------------------------------------------------------------------------- LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc ; PAINTSTRUCT ps ; RECT rect ; switch (iMsg) { case WM_CREATE : // ::PlaySound (_T("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ; // ::EnumSystemCodePages((CODEPAGE_ENUMPROC)EnumCodePagesProc, CP_INSTALLED); // ::EnumSystemCodePages((CODEPAGE_ENUMPROC)EnumCodePagesProc, CP_SUPPORTED); return 0 ; // case WM_ERASEBKGND: return 0; case WM_PAINT : hdc = ::BeginPaint (hwnd, &ps) ; ::GetClientRect (hwnd, &rect) ; ::DrawText (hdc, _T("Hello, Windows 95!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; ::EndPaint (hwnd, &ps) ; return 0; case WM_DESTROY: ::PostQuitMessage (0); return 0; } return ::DefWindowProc (hwnd, iMsg, wParam, lParam) ; } // -------------------------------------------------------------------------- Прикреплённая картинка
|
Сообщ.
#33
,
|
|
|
Цитата ЫукпШ @ Нет, не работает. VS2008 -> Win32 empty project Windows XP? Не исключаю, что проблема может быть в ней. Ибо у меня вот: https://snag.gy/1UbQJW.jpg |
Сообщ.
#34
,
|
|
|
Спасибо за ответ.
1. По поводу хендла. Я использую для основного диалога: INT_PTR ret = DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc); 2. По размеру диалога. В редакторе ресурсов я тянул края диалога за квадратики. Активны были только черные квадратики, но при уменьшении размеров диалога или исчезала кнопка, или кнопки сужались. Посмотрите, пожалуйста, прикрепленный выше проект, там есть второй диалог без рамки диалога. |
Сообщ.
#35
,
|
|
|
Цитата B.V. @ Windows XP? Не исключаю, что проблема может быть в ней. Ибо у меня вот: https://snag.gy/1UbQJW.jpg дело в среде VS попробуй запустить экзешник не из среды. Добавлено Цитата tumanovalex @ 1. По поводу хендла. Я использую для основного диалога: INT_PTR ret = DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc); Через DialogBox нельзя получить хендл окна, а зачем этот хендл если окно модальное |
Сообщ.
#36
,
|
|
|
Цитата tumanovalex @ Как используя DialogBox получить хендл - я не понял. Мне нужно заменить DialogBox на CreateDialog? Да. И добавить цикл обработки сообщений ниже создания диалогов. Вместе с IsDialogMessage. Цитата tumanovalex @ но при уменьшении размеров диалога или исчезала кнопка, или кнопки сужались Ах, вот ты про что. Так это фича студийного конструктора, помогающая позиционировать элементы на клиентской области. Нажми Ctrl+G и она тебе не будет никак мешать задавать положение и размеры. Либо просто растяни пунктирный контур на весь диалог, эффект будет аналогичным Цитата Cfon @ дело в среде VS Дело, скорее, в ShowWindow после CreateProcess у Проводника. Аналогичный запуск из под командной строки не вызывает проблем.. |
Сообщ.
#37
,
|
|
|
Цитата B.V. @ Дело, скорее, в ShowWindow после CreateProcess у Проводника. Аналогичный запуск из под командной строки не вызывает проблем.. точно так |
Сообщ.
#38
,
|
|
|
Цитата B.V. @ Цитата ЫукпШ @ Нет, не работает. VS2008 -> Win32 empty project Windows XP? Не исключаю, что проблема может быть в ней. Увы, это не так. Проверял и компиляцию и выполнение на XP SP2,SP3, WIN7. (все x86) Под Вистой собрать не могу, но выполняется также. (x86,x64). Сборки приложения x86, x64. Под WIN8 я тоже проверить могу, и, вероятно, под WIN98. (Только придётся собрать проект VS2005-ой.) Нутром чую, что это незачем. Добавлено Не вижу окна тестовой программы... Покажи окошко. А такой вариант я уже видел - стиль правильный, а окошко не развернулось. Это я подразумевал под словами "мерзко глючит". Добавлено Цитата B.V. @ Аналогичный запуск из под командной строки не вызывает проблем.. Да. Это я забыл сделать. Если из командной строки - развернётся. Но на это рассчитывать не хотелось бы. --- Всем спасибо, обсуждение оказалось для меня очень полезным. Теперь стало понятно, для надёжного восстановления размеров и расположения главного окна на скрине, необходимо вызвать "ShowWindow" не менее 2-х раз. |
Сообщ.
#39
,
|
|
|
Второй диалог уменьшить удалось, хендл первого диалог получил. Код получился такой:
#include <windows.h> #include "resource.h" BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM); BOOL CALLBACK DlgProc2(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HWND hwnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc); HWND hwnd2 = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG2), hwnd, (DLGPROC)DlgProc2); return 0; } BOOL CALLBACK DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: ShowWindow(hwnd, SW_MAXIMIZE); break; case WM_CLOSE: EndDialog(hwnd,0); break; } return FALSE; } BOOL CALLBACK DlgProc2(HWND hwnd2, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: ShowWindow(hwnd2, SW_NORMAL); break; case WM_COMMAND: { switch (LOWORD(wParam)) { case ID_OK: EndDialog(hwnd2,1); break; case ID_CANCEL: EndDialog(hwnd2,0); break; } break; } case WM_CLOSE: EndDialog(hwnd2,0); break; } return FALSE; } Прикреплённый файлWin32dialog_02.zip (3,64 Кбайт, скачиваний: 86) |
Сообщ.
#40
,
|
|
|
Цитата tumanovalex @ Как дальше обрабатывать сообщения от этих диалогов и как расположить второй диалог в правом нижнем углу первого диалога - я не знаю. Может быть есть пример с диалогом, размещенным на другом диалоге? коллега может откроешь книгу по winapi? например есть хорошая книжка "win32 api разработка приложений для Windows" автор Юрий Щупак , 2008 года издание. там есть отдельная глава посвящённая диалоговым окнам. |
Сообщ.
#41
,
|
|
|
К сожалению, этой книги нигде в продаже нет. На торрентах тоже не нашел. А те книги по Win32API, которые я смотрел, не содержат информации об управлении диалоговыми окнами.
Добавлено У меня есть книга Румянцева "Азбука программирования на Win32", но в ней я информации об управлении диалогом в диалоге я не нашел. |
Сообщ.
#42
,
|
|
|
Цитата tumanovalex @ На торрентах тоже не нашел. Если ты воспользуешься яндексом и будешь просто искать стороку : "win32 api разработка приложений для Windows" автор Юрий Щупак книга найдётся почти сразу. --- Что-то надо делать и самому, иначе точно ничего не получится. |
Сообщ.
#43
,
|
|
|
Спасибо, нашел. Буду изучать.
|
Сообщ.
#44
,
|
|
|
Наконец-то удалось вывести на экран основной диалог и кнопки:
#include <windows.h> #include "resource.h" HWND hwnd, hwndBtn; BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM); BOOL CALLBACK DlgProcBtn(HWND, UINT, WPARAM, LPARAM); void MoveDlg(HWND, HWND); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; hwnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc); hwndBtn = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG2), hwnd, (DLGPROC)DlgProcBtn); IsDialogMessage(hwndBtn, &msg); // // Не знаю, как правильно обработать результат проверки IsDialogMessage while (GetMessage(&msg, NULL, 0, 0)) { if (!IsDialogMessage(hwndBtn, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam; } BOOL CALLBACK DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: ShowWindow(hwnd, SW_MAXIMIZE); break; case WM_CLOSE: EndDialog(hwnd,0); break; } return FALSE; } BOOL CALLBACK DlgProcBtn(HWND hwndBtn, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: ShowWindow(hwndBtn, SW_NORMAL); MoveDlg(hwnd, hwndBtn); break; case WM_COMMAND: { switch (LOWORD(wParam)) { case ID_OK: EndDialog(hwndBtn,1); break; case ID_CANCEL: EndDialog(hwndBtn,0); break; } break; } case WM_CLOSE: EndDialog(hwndBtn,0); break; //SendMessage; // Не знаю, как правильно послать сообщение break; } return FALSE; } void MoveDlg(HWND hParent, HWND hDlg) { RECT rcParent, rcDlg; POINT p0; GetClientRect(hParent, &rcParent); GetWindowRect(hDlg, &rcDlg); int width = rcDlg.right - rcDlg.left; int height = rcDlg.bottom - rcDlg.top; p0.x = rcParent.right - width - 10; p0.y = rcParent.bottom - height; MoveWindow(hDlg, p0.x, p0.y, width, height, TRUE); } Прикреплённый файлWin32dialog_03.zip (3,87 Кбайт, скачиваний: 103) |
Сообщ.
#45
,
|
|
|
Цитата tumanovalex @ Однако основной диалог и кнопки закрываются по-отдельности и после их закрытия программа зависает. Как я понимаю, это вызвано строками, которые я пометил как "Не знаю". Помогите, пожалуйста, разобраться, как правильно посылать и обрабатывать сообщения. смотрел смотрел твой проект и ничего не понял зачем создается два диалога? только для группировки двух кнопок? ! Нарушение п. 1.3 правил форума Cfon, я предупреждал |