Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];

Вниз

стиль MF_OWNERDRAW в PopUp меню - как при появлении перерисовать?   Найти похожие ветки 

 
VirEx ©   (2006-01-28 13:30) [0]

обычный код как всегда:
HandlePopUp:=CreatePopupMenu;
InsertMenu(HandlePopUp,MF_BYPOSITION,MF_STRING or MF_OWNERDRAW ,1,PChar("item1");
InsertMenu(HandlePopUp,MF_BYPOSITION,MF_STRING or MF_OWNERDRAW ,2,PChar("item2");
TrackPopupMenu(HandlePopUp,TPM_LEFTALIGN, p.X, p.Y,0,wnd,nil);

при появлении мне нужно перерисовать все элементы - item"ы при появлении меню, потому-что при появлении меню, оное является "чистым", кроме конечно первого item1, т.к. он по умолчанию выделяется, т.е. главное окно wnd получает WM_DRAWITEM для первого элемента (где я его и рисую)

WM_INITMENUPOPUP и WM_INITMENU вызываются до появления меню, т.е. дескриптора контекста рисования ещё нет.

как решить данный сабжжж?


 
VirEx ©   (2006-01-28 16:04) [1]

Удалено модератором
Примечание: Создание пустых сообщений


 
Nick Denry ©   (2006-01-29 01:44) [2]

Не совсем корректный код, писался очень давно.


.............
{Функция отрисовки элемента меню}

Function DrawMenuItem(PDrwItStruct: PDrawItemStruct;PaintStruct:TPAINTSTRUCT;

HDrawBitmap,HDrawBitmapH: HBITMAP;TextToDraw: string):bool;

var Tdc: hdc;

TempBMP:HBITMAP;

TextRect : TRect;

{brush:hbrush;}

PixRef:TcolorRef;

x,y:word;

Begin

tdc:=CreateCompatibleDC(PaintStruct.hdc);

SelectObject(tdc,HDrawBitmap);

for x:=0 to 16 do begin

for y:=0 to 16 do begin

PixRef:=GetPixel(tdc,x,y);

if PixRef=RGB(200,200,200) then begin

setpixel(tDC,x,y,GetSysColor(COLOR_MENU));

end;

end;

end;

BitBlt(PDrwItStruct^.hDC,PDrwItStruct^.rcItem.Left+2,PDrwItStruct^.rcItem.Top+1,16,

16,tdc,0,0,SrcCopy);

TextRect:=PDrwItStruct^.rcItem;

TextRect.Left:=TextRect.Left+22;

DrawText(PDrwItStruct^.hDC,PChar(TextToDraw),Length(TextToDraw),TextRect,

DT_SINGLELINE or DT_VCENTER or DT_LEFT);

deletedc(tdc);

if PDrwItStruct^.itemAction=ODA_SELECT then

begin

{  MNull_Pen,

 MColor_Pen,

 MColor_Menu_Pen     : HPEN;

 MColor_Brush,

 MCOlor_menu_Brush   : HBRUSH;}

DeleteObject(SelectObject(PDrwItStruct^.hdc, MNull_Pen));

    if (PDrwItStruct^.itemState and ODS_SELECTED) <> 0  then begin

    {SetBkColor(PDrwItStruct^.HDC, GetSysColor(COLOR_HIGHLIGHT));

    DeleteObject(SelectObject(PDrwItStruct^.HDC,GetSysColorBrush(COLOR_HIGHLIGHT)));

    DeleteObject(SelectObject(PDrwItStruct^.hDC,CreatePen(PS_SOLID ,0,GetSysColor(COLOR_MENUTEXT))));}

    SetTextColor(PDrwItStruct^.HDC, RGB(0,0,0));

    SetBkColor(PDrwItStruct^.HDC, RGB(192,192,255));

    DeleteObject(SelectObject(PDrwItStruct^.HDC,MColor_Brush));

    DeleteObject(SelectObject(PDrwItStruct^.hDC,MColor_Pen));

    {swapBitmaps}

    TempBMP:=HDrawBitmapH;

    HDrawBitmapH:=HDrawBitmap;

    HDrawBitmap:=TempBMP;

  end else begin

DeleteObject(SelectObject(PDrwItStruct^.HDC, MColor_menu_Brush));

DeleteObject(SelectObject(PDrwItStruct^.hdc,   MColor_Menu_Pen));

end;

Rectangle(PDrwItStruct^.HDC, PDrwItStruct^.rcItem.Left,

PDrwItStruct^.rcItem.Top

,PDrwItStruct^.rcItem.Right,

PDrwItStruct^.rcItem.Bottom);

tdc:=CreateCompatibleDC(PaintStruct.hdc);

SelectObject(tdc,HDrawBitmap);

{for x:=0 to 16 do begin

for y:=0 to 16 do begin

PixRef:=GetPixel(tDC,x,y);

if PixRef=RGB(200,200,200) then begin

setpixel(tDC,x,y,GetSysColor(COLOR_MENU));

end;

end;

end;}

BitBlt(PDrwItStruct^.hDC,PDrwItStruct^.rcItem.Left+2,PDrwItStruct^.rcItem.Top+1,16,

16,tdc,0,0,SrcCopy);

TextRect:=PDrwItStruct^.rcitem;

TextRect.Left:=TextRect.Left+22;

DrawText(PDrwItStruct^.hDC,PChar(TextToDraw),Length(TextToDraw),TextRect,

DT_SINGLELINE or DT_VCENTER or DT_LEFT);

deletedc(tdc);

end;

Result:=True;

End;
............

{ОКОННАЯ ПРОЦЕДУРА ГЛАВНОГО ОКНА}

Function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult;

stdcall;

Begin

 case msg of
..................
   WM_MEASUREITEM:

     begin

    if PMeasureItemStruct(lparam).CtlType<>odt_menu then halt;

       PMeasureItemStruct(lparam).itemWidth:=78;

       PMeasureItemStruct(lparam).itemHeight:=18;

      end;

   WM_DRAWITEM:

     begin

       if PDrawItemStruct(lparam).itemID=ID_OPENCD then begin

       DrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuOpenCD,bmpMenuOpenCDH,menu_opencd);

       end;

       if PDrawItemStruct(lparam).itemID=ID_CloseCD then begin

       DrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuCloseCD,bmpMenuCloseCDH,menu_closecd);

       end;

       if PDrawItemStruct(lparam).itemID=ID_OPTIONS then begin

       DrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuOptions,bmpMenuOptionsH,menu_settings);

       end;

       if PDrawItemStruct(lparam).itemID=ID_HIDE then begin

       DrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuHide,bmpMenuHideH,menu_hide);

       end;

       if PDrawItemStruct(lparam).itemID=ID_HELP then begin

       DrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuHelp,bmpMenuHelpH,menu_help);

       end;

       if PDrawItemStruct(lparam).itemID=ID_EXIT then begin

       DrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuExit,bmpMenuExitH,menu_exit);

       end;

       if PDrawItemStruct(lparam).itemID=ID_RUSSIAN then begin

       DrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuLangRus,bmpMenuLangRusH,"Русский");

       end;

       if PDrawItemStruct(lparam).itemID=ID_ENGLISH then begin

       DrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuLangEng,bmpMenuLangEngH,"English");

       end;

       if PDrawItemStruct(lparam).itemID=ID_LANGUAGE then begin

       DrawMenuItem(PDrawItemStruct(lparam),menu_pstr,bmpMenuLang,bmpMenuLangH,  menu_langauge);

       end;

     end;
.................


Соответственно, за if вместо case также не пинать, но пример достаточен, для того, что бы понять суть работы


 
VirEx ©   (2006-01-29 16:35) [3]


>  [2] Nick Denry ©   (29.01.06 01:44)

сенкс посмотрю :)



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.035 c
9-1128434814
3d[Power]__
2005-10-04 18:06
2006.04.16
Простая физ симуляция


6-1129731733
Максим
2005-10-19 18:22
2006.04.16
MAC адрес


2-1142484602
de_ICER-T44
2006-03-16 07:50
2006.04.16
требуется помощь dbf excel


15-1143130425
Джо
2006-03-23 19:13
2006.04.16
Exit и компания


4-1138716801
Still Swamp
2006-01-31 17:13
2006.04.16
Тапи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский