Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.16;
Скачать: CL | DM;

Вниз

стиль 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 вся ветка

Текущий архив: 2006.04.16;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.113 c
3-1140681806
Чапаев
2006-02-23 11:03
2006.04.16
Программная установка пароля на БД Access (Jet 4.0)


15-1143213902
Juice
2006-03-24 18:25
2006.04.16
Альтернатива TImageList


15-1143490048
fann
2006-03-28 00:07
2006.04.16
давно не работал с делфи, продскажите..


2-1143131539
anton773
2006-03-23 19:32
2006.04.16
загрузить сообщение


2-1144052417
Sania
2006-04-03 12:20
2006.04.16
Вопрос по screenshot ам





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский