Главная страница
    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.046 c
8-1131809965
Jimmy
2005-11-12 18:39
2006.04.16
Сохранение bmp файла из image с нужным dpi


2-1143619363
jenya_rus
2006-03-29 12:02
2006.04.16
Изменение имен большого кол-ва файлов...


5-1129761486
bosia
2005-10-20 02:38
2006.04.16
Проблема перехода из режима Design Time в Run Time


1-1142394627
atruhin
2006-03-15 06:50
2006.04.16
Можно ли увиличить ширину ScrollBar


15-1143185711
Александр Иванов
2006-03-24 10:35
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский