Главная страница
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.48 MB
Время: 0.043 c
15-1143114120
Kolan
2006-03-23 14:42
2006.04.16
Контекстное меню изменилось для нек. файлов...


2-1143624495
pkm
2006-03-29 13:28
2006.04.16
Просмотр фалов в папке.


3-1140516501
dreamse
2006-02-21 13:08
2006.04.16
как выбрать Select с таблицой DataTime ?


15-1143109632
iamdanil
2006-03-23 13:27
2006.04.16
помогите с выводом сообщения


15-1143133574
User32
2006-03-23 20:06
2006.04.16
подскажите что это такое с программой?