Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не работает код

9.1K
05 мая 2010 года
motorw
134 / / 15.12.2009
Почему не работает код:
Код:
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    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;
14
06 мая 2010 года
Phodopus
3.3K / / 19.06.2008
Потому что это С. Потому что он не полный. Потому что не приложен компилятор...
9.1K
07 мая 2010 года
motorw
134 / / 15.12.2009
Цитата: Phodopus
Потому что это С. Потому что он не полный. Потому что не приложен компилятор...


Ничего не понял. Перефразируешь?

9.1K
07 мая 2010 года
motorw
134 / / 15.12.2009
К вопросу выше - еще проблема: необходимо сделать так, чтобы при нажатии кнопки в одном диалоговом окне вылезло другое(тоже диалоговое окно). В ресурсах описал:
Код:
DLG_MAIN DIALOGEX 300, 200, 250, 200

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 задефайнил, все логично, все должно работать.
В итоге в коде:
 
Код:
case IDC_BTN_DL:
      DialogBox(hInst, MAKEINTRESOURCE(DLG_QUEUE),NULL, QueueProc);

Вылезает такое окно:

В чем проблема?
14
07 мая 2010 года
Phodopus
3.3K / / 19.06.2008
Цитата: motorw
Ничего не понял. Перефразируешь?


Аналогично.
Выкладывай проект целиком короче.

9.1K
07 мая 2010 года
motorw
134 / / 15.12.2009
Здесь
399
07 мая 2010 года
KIV
432 / / 20.01.2009
Не очень понял картинку. Появляются окна без заголовков? Тогда проблема решается просто - надо стили полностью указывать: WS_CAPTION + WS_SYSMENU + WS_THICKFRAME. WS_SYSMENU убери если тебе не нужна кнопочка закрытия.
9.1K
07 мая 2010 года
motorw
134 / / 15.12.2009
Дело не в стилях. Код бы посмотрел, что я залил - понял бы. Это просто баг какой-то бредовый. Вот я и хочу узнать, как от него избавиться. а дело вовсе не в оформлении или прочей косметической лабуде.
399
08 мая 2010 года
KIV
432 / / 20.01.2009
Не нравится окно "Очередь"? А как оно должно выглядеть? У меня оно выглядит точно также как я и предпологал увидев ресурс. Скажите, что вы хотите получить? Попробую угадать: вы хотите, чтобы окно изменяло размер? Насколько мне известно окно без заголовка стандартными стредствами изменять размеры не будет. По крайней мере WS_THCIKFRAME тут не поможет. Ещё можно предположить, что вы хотели бы дать пользователю возможность перемещать окно череди по экрану. Это сделать очень просто - в WS_LMOUSEBUTTONDOWN (или по другому сообщению, указывающему на нажатие кнопки мыши) написать эту строку: SendMessage(wnd,WM_SYSCOMMAND,0xF012,0); Вполне возможно так же можно и изменять размеры окна. Только проверять, что щёлкнули по границе окна и вместо 0xF012 посылать чтото другое.
UPD: Опытным путём выяснил:
0xF00E - реакция как если бы вы изменяли размер окна за нижний край
0xF00D - за правый нижний
0xF00B - за правый край
Значения между этими ведут себя немного странновато (например, вертикальное изменение окна, которое управляется не вертикальными, а горизонтальными движениями мыши)
9.1K
08 мая 2010 года
motorw
134 / / 15.12.2009
Цитата: KIV
Не нравится окно "Очередь"? А как оно должно выглядеть? У меня оно выглядит точно также как я и предпологал увидев ресурс. Скажите, что вы хотите получить? Попробую угадать: вы хотите, чтобы окно изменяло размер? Насколько мне известно окно без заголовка стандартными стредствами изменять размеры не будет. По крайней мере WS_THCIKFRAME тут не поможет. Ещё можно предположить, что вы хотели бы дать пользователю возможность перемещать окно череди по экрану. Это сделать очень просто - в WS_LMOUSEBUTTONDOWN (или по другому сообщению, указывающему на нажатие кнопки мыши) написать эту строку: SendMessage(wnd,WM_SYSCOMMAND,0xF012,0); Вполне возможно так же можно и изменять размеры окна. Только проверять, что щёлкнули по границе окна и вместо 0xF012 посылать чтото другое.
UPD: Опытным путём выяснил:
0xF00E - реакция как если бы вы изменяли размер окна за нижний край
0xF00D - за правый нижний
0xF00B - за правый край
Значения между этими ведут себя немного странновато (например, вертикальное изменение окна, которое управляется не вертикальными, а горизонтальными движениями мыши)


Не, я просто хочу создать еще одно диалоговое окно. Всего-то. Никаких хитростей и приблудов. Делаю простым способом:
Обрабатываю нажатие кнопки и в кейсе:

 
Код:
DialogBox(второе диалоговое окно)...;

И вылезает сия хрень. Просто напросто такой баг при вызове DialogBox. Хочу знать, как победить.
И повторюсь уже в не знаю какой раз: не зависит от стилей окон! Не при чем здесь они! Даже если были бы причем - почему первое окно с такими же параметрами работает тогда?
399
09 мая 2010 года
KIV
432 / / 20.01.2009
Я знаю в чём дело. Вот как надо исправить процедуру QueueProc:
Код:
BOOL CALLBACK QueueProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    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.
9.1K
09 мая 2010 года
motorw
134 / / 15.12.2009
Цитата: KIV
Я знаю в чём дело. Вот как надо исправить процедуру QueueProc:
Код:
BOOL CALLBACK QueueProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    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) ?

399
09 мая 2010 года
KIV
432 / / 20.01.2009
Цитата:
Только вот, WP_PAINT диалоговые окна не получают


Ещё как получают! Я даже писал OpenGL приложение на диалогах. Правда, там всё сильно мерцало и пришлось в конце концов использовать RegisterClass и CreateWindowEx...

9.1K
09 мая 2010 года
motorw
134 / / 15.12.2009
Цитата: KIV
Ещё как получают! Я даже писал OpenGL приложение на диалогах. Правда, там всё сильно мерцало и пришлось в конце концов использовать RegisterClass и CreateWindowEx...


Странно. Меня учили всегда, что диалоговые окна только WM_INITDIALOG получают(вместо WM_PAINT).

399
10 мая 2010 года
KIV
432 / / 20.01.2009
Они получают почти все сообщения. Я это по своему опыту могу сказать.
Цитата:
WM_INITDIALOG получают(вместо WM_PAINT).


WM_PAINT и WM_INITDIALOG это очень разные вещи. WM_INITDIALOG уж если проводить сравнение заменяет WM_CREATE. Он вызывается для инициализации диалога ещё до его показа. WM_PAINT вызывается каждый раз, когда надо перерисовать клиентскую часть окна. Кстати, его перехват, но не обработка не так уж и страшны. В вашем случае вы перехватывали, но не обрабатывали WM_NCPAINT он отвечает за рисование заголовков. Я проверил это: создал приложение с диалогом. В нём при WM_NCPAINT вернул TRUE. Заголовок у окна не отрисовался. Хотя если убрать перехват WM_NCPAINT он появлялся.

9.1K
10 мая 2010 года
motorw
134 / / 15.12.2009
А вы правда специалист :) Где бы такую литературу почитать.. А то что-то мне универская программа не очень нравится последнее время..
И вопрос - почему же кнопка через WM_DRAWITEM не обрабатывается?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог