Владелец Draw Кнопка Кнопка Force Обновить

У меня есть 4 кнопки рисования владельца, которые работают как система вкладок для моей программы. У меня проблема в том, что, когда я нажимаю на одну из кнопок, мне нужно изменить изображения других кнопок. Но всякий раз, когда я пытаюсь сбросить изображения, он просто меняет изображение на кнопке, которую я нажал. Есть ли возможность менять изображения на других кнопках без нажатия?

INT_PTR CALLBACK Springboard::DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam){
static DRAWITEMSTRUCT* pdis;

switch (msg) {
case WM_DRAWITEM:

pdis = (DRAWITEMSTRUCT*) lParam;
// (winuser.h) Maybe you also want to account for pdis->CtlType (ODT_MENU, ODT_LISTBOX, ODT_COMBOBOX, ODT_BUTTON, ODT_STATIC)
switch(pdis->CtlID) {
case IDC_TAB1:
theSpringboard.myManageOwnerDrawIconButton(pdis, hInstance);
break;
case IDC_TAB2:
theSpringboard.myManageOwnerDrawIconButton(pdis, hInstance);

break;
case IDC_TAB3:
theSpringboard.myManageOwnerDrawIconButton(pdis, hInstance);
break;
case IDC_TAB4:
theSpringboard.myManageOwnerDrawIconButton(pdis, hInstance);
break;
case IDC_TAB5:
theSpringboard.myManageOwnerDrawIconButton(pdis, hInstance);
break;
default:
break;
}

int Springboard::myManageOwnerDrawIconButton(DRAWITEMSTRUCT* pdis, HINSTANCE hInstance) {
static RECT rect;
static HBITMAP hCurrIcon, hSTDc,  hSTDoff, hSTDon, hVFXc, hVFXoff, hVFXon, hCITYc, hCITYoff, hCITYon, hMAXc, hMAXoff, hMAXon, hSETc, hSEToff, hSETon;
rect = pdis->rcItem;

hSTDoff = (HBITMAP) LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_STDOFF));
hSTDon = (HBITMAP) LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_STDON));
hSTDc = (HBITMAP) LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_STDCLICK));
hVFXoff = (HBITMAP) LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_VFXOFF));
hVFXon = (HBITMAP) LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_VFXON));
hVFXc = (HBITMAP) LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_VFXCLICK));
hCITYoff = (HBITMAP) LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_CITYOFF));
hCITYon = (HBITMAP) LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_CITYON));
hCITYc = (HBITMAP) LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_CITYCLICK));
hMAXoff = (HBITMAP) LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_MAXOFF));
hMAXon = (HBITMAP) LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_MAXON));
hMAXc = (HBITMAP) LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_MAXCLICK));
hSEToff = (HBITMAP) LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_SETTINGOFF));
hSETon = (HBITMAP) LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_SETTINGON));
hSETc = (HBITMAP) LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_SETTINGCLICK));

if (IDC_TAB1 == pdis->CtlID) {
// If the button is selected, display the
// "active" icon, else the "inactive" icon:

if (pdis->itemState & ODS_SELECTED) hCurrIcon = hSTDc;
else hCurrIcon = hSTDoff;
if(TabRoll == 1) hCurrIcon = hSTDon;
}

if (IDC_TAB2 == pdis->CtlID) {
// If the button is selected, display the
// "active" icon, else the "inactive" icon:
if (pdis->itemState & ODS_SELECTED) hCurrIcon = hVFXc;
else hCurrIcon = hVFXoff;
//if(TabRoll == 2) hCurrIcon = hVFXon;
}

if (IDC_TAB3 == pdis->CtlID) {
// If the button is selected, display the
// "active" icon, else the "inactive" icon:
if (pdis->itemState & ODS_SELECTED) hCurrIcon = hCITYc;
else hCurrIcon = hCITYoff;
//if(TabRoll == 3) hCurrIcon = hCITYon;
}

if (IDC_TAB4 == pdis->CtlID) {
// If the button is selected, display the
// "active" icon, else the "inactive" icon:

if (pdis->itemState & ODS_SELECTED) hCurrIcon = hMAXc;
else hCurrIcon = hMAXoff;
//if(TabRoll == 4) hCurrIcon = hMAXon;
}

if (IDC_TAB5 == pdis->CtlID) {
// If the button is selected, display the
// "active" icon, else the "inactive" icon:
if (pdis->itemState & ODS_SELECTED){
hCurrIcon = hSETc;}
else{
hCurrIcon = hSEToff;}
//if(TabRoll == 5) hCurrIcon = hSETon;
}

HDC hdc = CreateCompatibleDC(pdis->hDC);
SelectObject(hdc, hCurrIcon);

BitBlt(pdis->hDC,0,
0,ICON_WIDTH,
ICON_HEIGHT, hdc, 0, 0, SRCCOPY);

DeleteDC(hdc);

return(RET_OK);

}

0

Решение

Вы можете упростить DlgProc:

INT_PTR CALLBACK Springboard::DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DRAWITEM:
theSpringboard.myManageOwnerDrawIconButton((DRAWITEMSTRUCT*)lp, hInstance);
break;
//...
return FALSE;
}

В myManageOwnerDrawIconButtonВам нужны эти изменения:

От HDC hdc = CreateCompatibleDC(pdis->hDC);

Для того, чтобы:

HDC hdc = pdis->hDC; и тогда вам не нужно звонить DeleteDC(hdc);

Изменить декларацию rect, это не должно быть статичным.

RECT rect = pdis->rcItem;

Другие статические переменные нужно инициализировать один раз, вот и весь смысл статических:

static HBITMAP hCurrIcon = (HBITMAP) LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_something));
//...

ODS_SELECTED просто означает, что кнопка нажата. Вы можете использовать свои собственные глобальные переменные, чтобы вручную отслеживать кнопки, устанавливать выбор и удалять выбор для других кнопок …

PS я добавил winapi тег для вашего вопроса.

0

Другие решения


По вопросам рекламы [email protected]