Не работает код
{
hbm1 =(HICON) LoadIcon( hInst, "playnofocus.ico");
hbm2 =(HICON) LoadIcon( hInst, "playactive.ico");
HDC hMemDC;
LPDRAWITEMSTRUCT pdis;
switch(uMsg)
{
case WM_DRAWITEM:
pdis=(LPDRAWITEMSTRUCT)lParam;
hMemDC=CreateCompatibleDC(pdis->hDC);
switch (pdis->itemAction)
{
case ODA_SELECT:
if (pdis->itemState & ODS_SELECTED)
{
SelectObject(hMemDC, hbm2);
}
break;
default:
SelectObject(hMemDC, hbm1);
}
//FillRect(pdis->hDC, &pdis->rcItem, hCurBrush);
StretchBlt(
pdis->hDC,
pdis->rcItem.left,
pdis->rcItem.top,
pdis->rcItem.right - pdis->rcItem.left,
pdis->rcItem.bottom - pdis->rcItem.top,
hMemDC,
0, 0,
64,
64,
SRCCOPY);
DeleteDC(hMemDC);return TRUE;
Ничего не понял. Перефразируешь?
CAPTION "EasyDownload"
FONT 8, "MS Sans Serif", 0, 0, 1
STYLE WS_THICKFRAME
BEGIN
...кнопки...
END
DLG_QUEUE DIALOGEX 6,5,250,250
CAPTION "Очередь"
FONT 8, "Ms Sans Serif", 0,0,1
STYLE WS_THICKFRAME
BEGIN
...одна кнопка...
END
В resource.h задефайнил, все логично, все должно работать.
В итоге в коде:
DialogBox(hInst, MAKEINTRESOURCE(DLG_QUEUE),NULL, QueueProc);
Вылезает такое окно:
В чем проблема?
Аналогично.
Выкладывай проект целиком короче.
UPD: Опытным путём выяснил:
0xF00E - реакция как если бы вы изменяли размер окна за нижний край
0xF00D - за правый нижний
0xF00B - за правый край
Значения между этими ведут себя немного странновато (например, вертикальное изменение окна, которое управляется не вертикальными, а горизонтальными движениями мыши)
UPD: Опытным путём выяснил:
0xF00E - реакция как если бы вы изменяли размер окна за нижний край
0xF00D - за правый нижний
0xF00B - за правый край
Значения между этими ведут себя немного странновато (например, вертикальное изменение окна, которое управляется не вертикальными, а горизонтальными движениями мыши)
Не, я просто хочу создать еще одно диалоговое окно. Всего-то. Никаких хитростей и приблудов. Делаю простым способом:
Обрабатываю нажатие кнопки и в кейсе:
И вылезает сия хрень. Просто напросто такой баг при вызове DialogBox. Хочу знать, как победить.
И повторюсь уже в не знаю какой раз: не зависит от стилей окон! Не при чем здесь они! Даже если были бы причем - почему первое окно с такими же параметрами работает тогда?
{
switch(uMsg)
{
case WM_INITDIALOG:
//HWND savebutton=CreateWindow("button", "Сохранить",BS_BITMAP|WS_VISIBLE|WS_CHILD,100,80,80,15,hwndDlg,(HMENU)StaticID,hInst,NULL);
break;
case WM_CLOSE:
EndDialog(hwndDlg,0);
break;
/*case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_BTN_SAVE:
return TRUE;
case IDC_BTN_CANCEL:
if(MessageBox(0,"Вы уверены?", "Вы уверены, что хотите выйти?", MB_YESNO)==0){}
else{DestroyWindow(hwndDlg);}
}*/
default:
return FALSE;
}
return TRUE;
}
Всё дело в том, что вы обрабатывали ВСЕ сообщения, которые поступали диалогу. В том числе и WM_PAINT и многие другие. Поэтому, диалог не перерисоваволся, не перемещался, не имел нормальный курсор и вообще ни как не раегировал. Надо возвращать TRUE только если вы это сообщение обработали, а если нет, то вернуть FALSE.
{
switch(uMsg)
{
case WM_INITDIALOG:
//HWND savebutton=CreateWindow("button", "Сохранить",BS_BITMAP|WS_VISIBLE|WS_CHILD,100,80,80,15,hwndDlg,(HMENU)StaticID,hInst,NULL);
break;
case WM_CLOSE:
EndDialog(hwndDlg,0);
break;
/*case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_BTN_SAVE:
return TRUE;
case IDC_BTN_CANCEL:
if(MessageBox(0,"Вы уверены?", "Вы уверены, что хотите выйти?", MB_YESNO)==0){}
else{DestroyWindow(hwndDlg);}
}*/
default:
return FALSE;
}
return TRUE;
}
Всё дело в том, что вы обрабатывали ВСЕ сообщения, которые поступали диалогу. В том числе и WM_PAINT и многие другие. Поэтому, диалог не перерисоваволся, не перемещался, не имел нормальный курсор и вообще ни как не раегировал. Надо возвращать TRUE только если вы это сообщение обработали, а если нет, то вернуть FALSE.
Большое спасибо! Действительно, забыл про дефолт... Теперь работает. Только вот, WP_PAINT диалоговые окна не получают :)А с кнопкой пустой что делать(WM_DRAWITEM) ?
Ещё как получают! Я даже писал OpenGL приложение на диалогах. Правда, там всё сильно мерцало и пришлось в конце концов использовать RegisterClass и CreateWindowEx...
Странно. Меня учили всегда, что диалоговые окна только WM_INITDIALOG получают(вместо WM_PAINT).
WM_PAINT и WM_INITDIALOG это очень разные вещи. WM_INITDIALOG уж если проводить сравнение заменяет WM_CREATE. Он вызывается для инициализации диалога ещё до его показа. WM_PAINT вызывается каждый раз, когда надо перерисовать клиентскую часть окна. Кстати, его перехват, но не обработка не так уж и страшны. В вашем случае вы перехватывали, но не обрабатывали WM_NCPAINT он отвечает за рисование заголовков. Я проверил это: создал приложение с диалогом. В нём при WM_NCPAINT вернул TRUE. Заголовок у окна не отрисовался. Хотя если убрать перехват WM_NCPAINT он появлялся.
И вопрос - почему же кнопка через WM_DRAWITEM не обрабатывается?