Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> кнопка ownerdraw, глюк кнопки 
:(
    Опции темы
Nikita0007
Дата 23.4.2010, 23:03 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 23.4.2010

Репутация: нет
Всего: нет



Ребят помогите плиз, почему у меня кнопка ownerdraw сначала отрисовывается нормально во всех 3-х состояниях а через некоторое время когда я еще раз хочу нажать она сообщение WM_COMMAND обрабатывает, но не отрисовывается вообще.
Вот код самой программы:
Код

#include <windows.h>
#include "fuck.h"
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";
HWND hButton;
int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Windows App",       /* Title Text */
           WS_POPUP, /* default window */
          200,       /* Windows decides the position */
           200,       /* where the window ends up on the screen */
           265,                 /* The programs width */
           265,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
hButton=CreateWindow("button", "Press me", WS_CHILD|WS_VISIBLE | BS_OWNERDRAW|BS_PUSHBUTTON,
20, 20, 265, 265, hwnd, (HMENU)10000, hThisInstance, NULL);
    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HBITMAP hPict0;   // изображение пассивной кнопки
    static HBITMAP hPict1;   // изображение активной кнопки
    static HBITMAP hPict2;   // изображение нажатой кнопки    
    static HDC hMemDC;       // контекст устройства в памяти
    static BITMAP bm;        // параметры растра
 HINSTANCE hInst;
    LPDRAWITEMSTRUCT pdis;
    static RECT rcBtnHelp, rect;
    int x0, y0 = 0;
    hInst = GetModuleHandle(NULL); 
int i;
i=0;
// Инициализация растровых изображений кнопки IDOK
        hPict0 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
        hPict1 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP2));
        hPict2 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP3));

    switch (message)
    {
case WM_DRAWITEM:  // сообщение, используемое для
                       // перерисовки кнопки Owner draw
        pdis = (LPDRAWITEMSTRUCT)lParam;
        hMemDC = CreateCompatibleDC(pdis->hDC);

        // Проверяем, какие события произошли
        switch (pdis->itemAction) {
        case ODA_FOCUS:
            if (pdis->itemState & ODS_FOCUS) 
                SelectObject(hMemDC, hPict1);
            else 
                SelectObject(hMemDC, hPict0);
            break;

        case ODA_SELECT:
            if (pdis->itemState & ODS_SELECTED) {
                SelectObject(hMemDC, hPict2);
            }
            break;

        default:
            SelectObject(hMemDC, hPict0);
        } // end of switch

        // Вывод изображения кнопки с учетом произошедших событий
        FillRect(pdis->hDC, &pdis->rcItem, hCurBrush);
        x0 = ((pdis->rcItem.right - pdis->rcItem.left) - bm.bmWidth) / 2;
        // Картинка ...
        BitBlt(pdis->hDC, 0, 0, 255,255,
                hMemDC, 0, 0, SRCCOPY);
        // рамка вокруг кнопки
        DeleteDC(hMemDC); // !!! не забудьте удалить hMemDC
        return TRUE;

    case WM_SETCURSOR:  // отслеживание фокуса ввода для курсора мыши
        if ((HWND)wParam == hButton)    
            if (GetFocus() != hButton)  SetFocus(hButton);

        if ((HWND)wParam == hwnd) 
            if (GetFocus() != hwnd) 
                SetFocus(hwnd);
            return FALSE;
        case WM_COMMAND:
        {
        MessageBox(NULL,"jhkjkk","",MB_OK);
      return 0;
      }
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}



M
GremlinProg
Nikita0007

smile

Это сообщение отредактировал(а) GremlinProg - 26.4.2010, 09:50
PM MAIL   Вверх
Nikita0007
Дата 25.4.2010, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 23.4.2010

Репутация: нет
Всего: нет



ну дайте хотябы пример ownerdraw кнопки плизз
PM MAIL   Вверх
Dem_max
Дата 26.4.2010, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



вот ULLib.2.3.7


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Earnest
Дата 26.4.2010, 08:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Мне кажется, это опять грабли с GDI-ресурсами. Ты их только потребляешь, но не освобождаешь. И пользуйся кнопкой "код".


--------------------
...
PM   Вверх
Nikita0007
Дата 27.4.2010, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 23.4.2010

Репутация: нет
Всего: нет



парни а можно еще вот такой вопрос: как мне сделать перерисовку в ownerdraw кнопке когда курсор находится на кнопке и когда его нет пробывал сделать вот так 
Код

if (pdis->itemState & ODS_HOTLIGHT)
                SelectObject(hMemDC, hPict1);
            else 
                SelectObject(hMemDC, hPict0);

но у меня компилятор выдает ошибку 
99 C:\Dev-Cpp\5233\main.cpp `ODS_HOTLIGHT' undeclared (first use this function) 
как можно это исправить скажите пожалуйста


M
GremlinProg
Nikita0007, над формой ответа есть 5 зеленых кнопок, последняя "Код" - специально для форматирования программного кода, пользуйся пожалуйста, чтобы никому не приходилось сильно напрягать мозги при чтении твоих сообщений


Это сообщение отредактировал(а) GremlinProg - 28.4.2010, 08:27
PM MAIL   Вверх
GremlinProg
Дата 28.4.2010, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



сообщение WM_DRAWITEM кроме кнопок обслуживает еще массу других компонент,
поэтому не все его состояния могут быть актуальны конкретно для кнопки

у кнопок в этом плане, на XP есть еще одно полезное уведомление: BCN_HOTITEMCHANGE
http://msdn.microsoft.com/en-us/library/bb775984(VS.85).aspx

в остальных случаях - через саб(супер)классинг + TrackMouseEvent + все замечания, касаемо этой функции

Добавлено через 9 минут и 45 секунд
а чтобы ODS_HOTLIGHT было видно, надо перед включением файла windows.h, вставить строчку:
Код

#define WINVER 0x0500


Добавлено через 11 минут и 24 секунды
ну или эту:
Код

#define ODS_HOTLIGHT        0x0040

если пользуешься старым SDK


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Nikita0007
Дата 28.4.2010, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 23.4.2010

Репутация: нет
Всего: нет



огромное вам спасибо
PM MAIL   Вверх
ZC1989
Дата 30.4.2010, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: 1
Всего: 1



GremlinProg, вот попробовал обрабатывать наведение мышки на кнопку, почему то не срабатываеткод

Код

case WM_NOTIFY:
        if( ((NMBCHOTITEM*)lParam)->hdr.hwndFrom == DrawDialog.bot_IndexPage.hwnd/* && ((NMBCHOTITEM*)lParam)->dwFlags & HICF_ENTERING */)
            MessageBox(0, "", "", 0);
break;



--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
GremlinProg
Дата 30.4.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(BCN_HOTITEMCHANGE Notification @  MSDN)

To use this notification code, you must provide a manifest specifying Comclt32.dll version 6.0. For more information on manifests, see Enabling Visual Styles.

+ по хорошему тут должна быть проверка, что с WM_NOTIFY пришел BCN_HOTITEMCHANGE и ни кто иной


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1291 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.