Форум: "WinAPI";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];
ВнизКак изменить цвет меню c помошью ф-й WinAPI? Найти похожие ветки
← →
Maxus (2003-05-27 21:15) [0]Ребята, задаю Вам этот вопрос, потому что надежда осталась только на Вас :))
Столкнулся со следующей проблемой: пишу на Visual C++ (просьба не ругаться) без использования MFC и иже с ними, т.е. в основном приходится писать на WinAPI. Поставили следующее требование: хотим чтобы меню программы было другого цвета (желтого например).
Что я перепробовал:
1)SetSysColors(...)
- не подходит т.к. хачит цвета меню во всей системе :(
2) чудесная есть командочкаSetMenuInfo(hMenu,MENUINFO)
- которая тоже к сожалению не подходит т.к. поддерживается не всеми операционками (2000, 98)
3) отрисовка меню самому: MFT_OWNERDRAW - здесь сходу тоже не получилось, а именно: не получилось сделать СРАЗУ ВСЕ меню типа OWNERDRAW, пришлось делать каждый элемент меню вручную :( естественно после этого нужным мне цветом рисуются только элементы меню, а полоска меню, остается серой :(( Причем выглядит это настолько кустарно, что понимаешь, что делаешь что-то не совсем так ;)
Вопрос такой: можно ли изменить цвет меню каким-нибудь более красивым или хотя бы более эффективным способом?
← →
Song (2003-05-27 21:17) [1]Скачать другое наиболее подходящее меню. Поверь: это легче
← →
Nick Denry (2003-05-28 21:43) [2]Можно, подожди еще день, плз, а то я протебя забыл.........
А ввобще ладно, держи что есть, если непонятно пиши еще.
А вообще на wm_draw проверяешь: if lparam(PDrawItemStruct)=ODT_MENU не для каждого элемента, а для типа контрола, вот тебе код, модифицируй як хочешь!
WM_DRAWITEM:
begin
if PDrawItemStruct(lparam).hwndItem=button1 then begin
dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,bmpButtonQuit);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left,PDrawItemStruct(lparam).rcItem.Top,32,
32,dcl,0,0,SrcCopy);
deletedc(dcl);
if PDrawItemStruct(lparam).itemAction=ODA_SELECT then
begin
DeleteObject(SelectObject(PDrawItemStruct(lparam).hdc, CreatePen(PS_NULL, 0, 0)));
if (PDrawItemStruct(lparam).itemState and ODS_SELECTED) <> 0 then begin
{TBmp:=bmpButtonQuit;
bmpButtonQuit:=bmpButtonQuitP;
bmpButtonQuitP:=Tbmp;}
dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,bmpButtonQuitP);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left,PDrawItemStruct(lparam).rcItem.Top,32,
32,dcl,0,0,SrcCopy);
deletedc(dcl);
end else begin
dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,bmpButtonQuit);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left,PDrawItemStruct(lparam).rcItem.Top,32,
32,dcl,0,0,SrcCopy);
deletedc(dcl);
end;
end;
end;
if PDrawItemStruct(lparam).hwndItem=button2 then begin
dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,bmpButtonHide);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left,PDrawItemStruct(lparam).rcItem.Top,32,
32,dcl,0,0,SrcCopy);
deletedc(dcl);
if PDrawItemStruct(lparam).itemAction=ODA_SELECT then
begin
DeleteObject(SelectObject(PDrawItemStruct(lparam).hdc, CreatePen(PS_NULL, 0, 0)));
if (PDrawItemStruct(lparam).itemState and ODS_SELECTED) <> 0 then begin
{TBmp:=bmpButtonQuit;
bmpButtonQuit:=bmpButtonQuitP;
bmpButtonQuitP:=Tbmp;}
dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,bmpButtonHideP);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left,PDrawItemStruct(lparam).rcItem.Top,32,
32,dcl,0,0,SrcCopy);
deletedc(dcl);
end else begin
dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,bmpButtonHide);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left,PDrawItemStruct(lparam).rcItem.Top,32,
32,dcl,0,0,SrcCopy);
deletedc(dcl);
end;
end;
end;
to be continied.....
← →
Nick Denry (2003-05-28 21:43) [3]Можно, подожди еще день, плз, а то я протебя забыл.........
А ввобще ладно, держи что есть, если непонятно пиши еще.
А вообще на wm_draw проверяешь: if lparam(PDrawItemStruct)=ODT_MENU не для каждого элемента, а для типа контрола, вот тебе код, модифицируй як хочешь!
WM_DRAWITEM:
begin
if PDrawItemStruct(lparam).hwndItem=button1 then begin
dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,bmpButtonQuit);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left,PDrawItemStruct(lparam).rcItem.Top,32,
32,dcl,0,0,SrcCopy);
deletedc(dcl);
if PDrawItemStruct(lparam).itemAction=ODA_SELECT then
begin
DeleteObject(SelectObject(PDrawItemStruct(lparam).hdc, CreatePen(PS_NULL, 0, 0)));
if (PDrawItemStruct(lparam).itemState and ODS_SELECTED) <> 0 then begin
{TBmp:=bmpButtonQuit;
bmpButtonQuit:=bmpButtonQuitP;
bmpButtonQuitP:=Tbmp;}
dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,bmpButtonQuitP);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left,PDrawItemStruct(lparam).rcItem.Top,32,
32,dcl,0,0,SrcCopy);
deletedc(dcl);
end else begin
dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,bmpButtonQuit);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left,PDrawItemStruct(lparam).rcItem.Top,32,
32,dcl,0,0,SrcCopy);
deletedc(dcl);
end;
end;
end;
if PDrawItemStruct(lparam).hwndItem=button2 then begin
dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,bmpButtonHide);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left,PDrawItemStruct(lparam).rcItem.Top,32,
32,dcl,0,0,SrcCopy);
deletedc(dcl);
if PDrawItemStruct(lparam).itemAction=ODA_SELECT then
begin
DeleteObject(SelectObject(PDrawItemStruct(lparam).hdc, CreatePen(PS_NULL, 0, 0)));
if (PDrawItemStruct(lparam).itemState and ODS_SELECTED) <> 0 then begin
{TBmp:=bmpButtonQuit;
bmpButtonQuit:=bmpButtonQuitP;
bmpButtonQuitP:=Tbmp;}
dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,bmpButtonHideP);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left,PDrawItemStruct(lparam).rcItem.Top,32,
32,dcl,0,0,SrcCopy);
deletedc(dcl);
end else begin
dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,bmpButtonHide);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left,PDrawItemStruct(lparam).rcItem.Top,32,
32,dcl,0,0,SrcCopy);
deletedc(dcl);
end;
end;
end;
to be continied.....
← →
Nick Denry (2003-05-28 21:45) [4]в продолжение...
if PDrawItemStruct(lparam).hwndItem=button3 then begin
dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,bmpButtonSave);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left,PDrawItemStruct(lparam).rcItem.Top,32,
32,dcl,0,0,SrcCopy);
deletedc(dcl);
if PDrawItemStruct(lparam).itemAction=ODA_SELECT then
begin
DeleteObject(SelectObject(PDrawItemStruct(lparam).hdc, CreatePen(PS_NULL, 0, 0)));
if (PDrawItemStruct(lparam).itemState and ODS_SELECTED) <> 0 then begin
dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,bmpButtonSaveP);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left,PDrawItemStruct(lparam).rcItem.Top,32,
32,dcl,0,0,SrcCopy);
deletedc(dcl);
end else begin
dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,bmpButtonSave);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left,PDrawItemStruct(lparam).rcItem.Top,32,
32,dcl,0,0,SrcCopy);
deletedc(dcl);
end;
end;
end;
if PDrawItemStruct(lparam).itemID=ID_RESTORE then begin
procDrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuOptions,bmpMenuOptionsH,"Options");
end;
if PDrawItemStruct(lparam).itemID=ID_MINIMIZE then begin
procDrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuHide,bmpMenuHideH,"Hide");
end;
if PDrawItemStruct(lparam).itemID=ID_QUIT then begin
procDrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuQuit,bmpMenuQuitH,"Exit");
end;
← →
Nick Denry (2003-05-28 21:47) [5]продолжение 3.3
if PDrawItemStruct(lparam).itemID=ID_CLOSECD then begin
ProcDrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuCloseCD,bmpMenuCloseCDH,"Close CD");
{dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,btn3bmp);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left+2,PDrawItemStruct(lparam).rcItem.Top+1,32,
32,dcl,0,0,SrcCopy);
TextRect:=PDrawItemStruct(lparam).rcitem;
TextRect.Left:=TextRect.Left+36;
SetBkColor(PDrawItemStruct(lparam).HDC, RGB(0,128,0));
DrawText(PDrawItemStruct(lparam).hDC,PChar("Close CD"),Length("Close CD"),TextRect,
DT_SINGLELINE or DT_VCENTER or DT_Left);
deletedc(dcl);
if (PDrawItemStruct(lparam).itemAction=ODA_SELECT) then
begin
DeleteObject(SelectObject(PDrawItemStruct(lparam).hdc, CreatePen(PS_NULL, 0, 0)));
if ((PDrawItemStruct(lparam).itemState and ODS_SELECTED) <> 0)
then begin
SetTextColor(PDrawItemStruct(lparam).HDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
SetBkColor(PDrawItemStruct(lparam).HDC, RGB(0,128,0));
brush:=CreateSolidBrush(RGB(0,255,0));
DeleteObject(SelectObject(PDrawItemStruct(lparam).HDC,brush));
DeleteObject(SelectObject(PDrawItemStruct(lparam).hDC,CreatePen(PS_SOLID ,0,RGB(0,128,0))));
end else begin
DeleteObject(SelectObject(PDrawItemStruct(lparam).HDC, RGB(0,128,0)));
DeleteObject(SelectObject(PDrawItemStruct(lparam).hdc, CreatePen(PS_SOLID ,0 ,GetSysColor(COLOR_MENU))));
end;
Rectangle(PDrawItemStruct(lparam).HDC, PDrawItemStruct(lparam).rcItem.Left,
PDrawItemStruct(lparam).rcItem.Top
,PDrawItemStruct(lparam).rcItem.Right,
PDrawItemStruct(lparam).rcItem.Bottom);
dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,btn3bmp);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left+2,PDrawItemStruct(lparam).rcItem.Top+1,110,
32,dcl,0,0,SrcCopy);
TextRect:=PDrawItemStruct(lparam).rcitem;
TextRect.Left:=TextRect.Left+36;
DrawText(PDrawItemStruct(lparam).hDC,PChar("Close CD"),Length("Close CD"),TextRect,
DT_SINGLELINE or DT_VCENTER or DT_Left);
deletedc(dcl);
end;}
end;
if PDrawItemStruct(lparam).itemID=ID_OPENCD then begin
procDrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuOpenCD,bmpMenuOpenCDH,
"Open CD");
{dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,btn4bmp);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left+2,PDrawItemStruct(lparam).rcItem.Top+1,32,
32,dcl,0,0,SrcCopy);
TextRect:=PDrawItemStruct(lparam).rcitem;
TextRect.Left:=TextRect.Left+36;
DrawText(PDrawItemStruct(lparam).hDC,PChar("CD Open"),Length("CD Open"),TextRect,
DT_SINGLELINE or DT_VCENTER or DT_Left);
deletedc(dcl);
if PDrawItemStruct(lparam).itemAction=ODA_SELECT then
begin
DeleteObject(SelectObject(PDrawItemStruct(lparam).hdc, CreatePen(PS_NULL, 0, 0)));
if (PDrawItemStruct(lparam).itemState and ODS_SELECTED) <> 0 then begin
SetTextColor(PDrawItemStruct(lparam).HDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
SetBkColor(PDrawItemStruct(lparam).HDC, GetSysColor(COLOR_HIGHLIGHT));
DeleteObject(SelectObject(PDrawItemStruct(lparam).HDC,GetSysColorBrush(COLOR_HIGHLIGHT)));
DeleteObject(SelectObject(PDrawItemStruct(lparam).hDC,CreatePen(PS_SOLID ,0,GetSysColor(COLOR_MENUTEXT))));
end else begin
DeleteObject(SelectObject(PDrawItemStruct(lparam).HDC, GetSysColorBrush(COLOR_MENU)));
DeleteObject(SelectObject(PDrawItemStruct(lparam).hdc, CreatePen(PS_SOLID ,0 ,GetSysColor(COLOR_MENU))));
end;
Rectangle(PDrawItemStruct(lparam).HDC, PDrawItemStruct(lparam).rcItem.Left,
PDrawItemStruct(lparam).rcItem.Top
,PDrawItemStruct(lparam).rcItem.Right,
PDrawItemStruct(lparam).rcItem.Bottom);
dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,btn4bmp);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left+2,PDrawItemStruct(lparam).rcItem.Top+1,32,
32,dcl,0,0,SrcCopy);
TextRect:=PDrawItemStruct(lparam).rcitem;
TextRect.Left:=TextRect.Left+36;
DrawText(PDrawItemStruct(lparam).hDC,PChar("CD Open"),Length("CD Open"),TextRect,
DT_SINGLELINE or DT_VCENTER or DT_Left);
deletedc(dcl);
end;}
end;
{MessageBeep(mb_iconhand);}
{result:=SetBkColor(PDrawItemStruct(lparam).hDC, GetSysColor(COLOR_HIGHLIGHT));
if result=0 then MessageBox(MaINwND,PChar("4324234"),PChar("3424"),mb_ok);}
end;
end;
С уважением, Nick Denry.
← →
Nick Denry (2003-05-28 21:47) [6]продолжение 3.3
if PDrawItemStruct(lparam).itemID=ID_CLOSECD then begin
ProcDrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuCloseCD,bmpMenuCloseCDH,"Close CD");
{dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,btn3bmp);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left+2,PDrawItemStruct(lparam).rcItem.Top+1,32,
32,dcl,0,0,SrcCopy);
TextRect:=PDrawItemStruct(lparam).rcitem;
TextRect.Left:=TextRect.Left+36;
SetBkColor(PDrawItemStruct(lparam).HDC, RGB(0,128,0));
DrawText(PDrawItemStruct(lparam).hDC,PChar("Close CD"),Length("Close CD"),TextRect,
DT_SINGLELINE or DT_VCENTER or DT_Left);
deletedc(dcl);
if (PDrawItemStruct(lparam).itemAction=ODA_SELECT) then
begin
DeleteObject(SelectObject(PDrawItemStruct(lparam).hdc, CreatePen(PS_NULL, 0, 0)));
if ((PDrawItemStruct(lparam).itemState and ODS_SELECTED) <> 0)
then begin
SetTextColor(PDrawItemStruct(lparam).HDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
SetBkColor(PDrawItemStruct(lparam).HDC, RGB(0,128,0));
brush:=CreateSolidBrush(RGB(0,255,0));
DeleteObject(SelectObject(PDrawItemStruct(lparam).HDC,brush));
DeleteObject(SelectObject(PDrawItemStruct(lparam).hDC,CreatePen(PS_SOLID ,0,RGB(0,128,0))));
end else begin
DeleteObject(SelectObject(PDrawItemStruct(lparam).HDC, RGB(0,128,0)));
DeleteObject(SelectObject(PDrawItemStruct(lparam).hdc, CreatePen(PS_SOLID ,0 ,GetSysColor(COLOR_MENU))));
end;
Rectangle(PDrawItemStruct(lparam).HDC, PDrawItemStruct(lparam).rcItem.Left,
PDrawItemStruct(lparam).rcItem.Top
,PDrawItemStruct(lparam).rcItem.Right,
PDrawItemStruct(lparam).rcItem.Bottom);
dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,btn3bmp);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left+2,PDrawItemStruct(lparam).rcItem.Top+1,110,
32,dcl,0,0,SrcCopy);
TextRect:=PDrawItemStruct(lparam).rcitem;
TextRect.Left:=TextRect.Left+36;
DrawText(PDrawItemStruct(lparam).hDC,PChar("Close CD"),Length("Close CD"),TextRect,
DT_SINGLELINE or DT_VCENTER or DT_Left);
deletedc(dcl);
end;}
end;
if PDrawItemStruct(lparam).itemID=ID_OPENCD then begin
procDrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuOpenCD,bmpMenuOpenCDH,
"Open CD");
{dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,btn4bmp);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left+2,PDrawItemStruct(lparam).rcItem.Top+1,32,
32,dcl,0,0,SrcCopy);
TextRect:=PDrawItemStruct(lparam).rcitem;
TextRect.Left:=TextRect.Left+36;
DrawText(PDrawItemStruct(lparam).hDC,PChar("CD Open"),Length("CD Open"),TextRect,
DT_SINGLELINE or DT_VCENTER or DT_Left);
deletedc(dcl);
if PDrawItemStruct(lparam).itemAction=ODA_SELECT then
begin
DeleteObject(SelectObject(PDrawItemStruct(lparam).hdc, CreatePen(PS_NULL, 0, 0)));
if (PDrawItemStruct(lparam).itemState and ODS_SELECTED) <> 0 then begin
SetTextColor(PDrawItemStruct(lparam).HDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
SetBkColor(PDrawItemStruct(lparam).HDC, GetSysColor(COLOR_HIGHLIGHT));
DeleteObject(SelectObject(PDrawItemStruct(lparam).HDC,GetSysColorBrush(COLOR_HIGHLIGHT)));
DeleteObject(SelectObject(PDrawItemStruct(lparam).hDC,CreatePen(PS_SOLID ,0,GetSysColor(COLOR_MENUTEXT))));
end else begin
DeleteObject(SelectObject(PDrawItemStruct(lparam).HDC, GetSysColorBrush(COLOR_MENU)));
DeleteObject(SelectObject(PDrawItemStruct(lparam).hdc, CreatePen(PS_SOLID ,0 ,GetSysColor(COLOR_MENU))));
end;
Rectangle(PDrawItemStruct(lparam).HDC, PDrawItemStruct(lparam).rcItem.Left,
PDrawItemStruct(lparam).rcItem.Top
,PDrawItemStruct(lparam).rcItem.Right,
PDrawItemStruct(lparam).rcItem.Bottom);
dcl:=CreateCompatibleDC(menu_pstr.hdc);
SelectObject(dcl,btn4bmp);
BitBlt(PDrawItemStruct(lparam).hDC,PDrawItemStruct(lparam).rcItem.Left+2,PDrawItemStruct(lparam).rcItem.Top+1,32,
32,dcl,0,0,SrcCopy);
TextRect:=PDrawItemStruct(lparam).rcitem;
TextRect.Left:=TextRect.Left+36;
DrawText(PDrawItemStruct(lparam).hDC,PChar("CD Open"),Length("CD Open"),TextRect,
DT_SINGLELINE or DT_VCENTER or DT_Left);
deletedc(dcl);
end;}
end;
{MessageBeep(mb_iconhand);}
{result:=SetBkColor(PDrawItemStruct(lparam).hDC, GetSysColor(COLOR_HIGHLIGHT));
if result=0 then MessageBox(MaINwND,PChar("4324234"),PChar("3424"),mb_ok);}
end;
end;
С уважением, Nick Denry.
← →
Maxus (2003-05-30 12:42) [7]Большое спасибо всем!!! ;)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c