Научите рисовать на диалогах из ресурсов?!
в частности интерисует PropertySheet с формами из ресурсов...
никак не могу нарисовать на STATICе,
использую в WM_PAINT DrawIcon, делаю всё прально вроде, но изначально не отрисовывается, а отрисовывается только если другим приложением форму закрыть и потихоньку отодвигать
вообщем научите, а то сам уже дня три бьюсь... пробовал уже и подмену wndproc у STATIC который из ресурсов создается, непомогло...
ответ жду либо в форуме либо по

ps: хотелось бы конечно примерчика, но в принципе и общий принцип подойдёт... каламбур-с
Здравствуйте Eazy-Z, Вы писали:
EZ>Научите рисовать на диалогах из ресурсов?!
EZ>в частности интерисует PropertySheet с формами из ресурсов...
EZ>никак не могу нарисовать на STATICе,
EZ>использую в WM_PAINT DrawIcon, делаю всё прально вроде, но изначально не отрисовывается, а отрисовывается только если другим приложением форму закрыть и потихоньку отодвигать
Так все правильно. Рисуй в WM_PAINT. Твоя проблема в том, что WM_PAINT вызывается только тогда, когда винды перерисовывают это окно. А если тебе надо перерисовать его тогда, когда тебе надо (например, в InitDialog), используй RedrawWindow.
Здравствуйте Eazy-Z, Вы писали:
EZ>Научите рисовать на диалогах из ресурсов?!
EZ>в частности интерисует PropertySheet с формами из ресурсов...
EZ>никак не могу нарисовать на STATICе,
EZ>использую в WM_PAINT DrawIcon, делаю всё прально вроде, но изначально не отрисовывается, а отрисовывается только если другим приложением форму закрыть и потихоньку отодвигать
EZ>вообщем научите, а то сам уже дня три бьюсь... пробовал уже и подмену wndproc у STATIC который из ресурсов создается, непомогло...
EZ>ответ жду либо в форуме либо по
EZ>ps: хотелось бы конечно примерчика, но в принципе и общий принцип подойдёт... каламбур-с
Если вся проблема в том, как нарисовать иконку, то ее и рисовать не надо! Есть же стиль SS_ICON!
Более точно опишу проблему. (пишу на дельфи)
В ресурсах есть форма, которая выводится на экран в виде PropertySheet:
procedure config;
var
SheetPage:Array [0..1] of TPropSheetPage;
SheetHeader:TPROPSHEETHEADER;
begin
SheetPage[0].dwSize:=SizeOf(TPropSheetPage);
SheetPage[0].dwFlags:=0;
SheetPage[0].hInstance:=HInstance;
SheetPage[0].pszTemplate:=MakeIntResource(1001);
SheetPage[0].pszIcon:=nil;
SheetPage[0].pfnDlgProc:=@GeneralProc;
SheetPage[0].pszTitle:=nil;
SheetPage[0].lParam:=0;
SheetPage[0].pfnCallback:=nil;
...
SheetHeader.dwSize:=SizeOf(TPropSheetHeader);
SheetHeader.dwFlags:=PSH_PROPSHEETPAGE or PSH_NOAPPLYNOW;
SheetHeader.hwndParent:=plugin.hwndParent;
SheetHeader.hInstance:=HInstance;
SheetHeader.pszIcon:=nil;
SheetHeader.pszCaption:=plugin.description;
SheetHeader.nPages:=SizeOf(SheetPage) div SizeOf(TPropSheetPage);
SheetHeader.nStartPage:=0;
SheetHeader.ppsp:=@SheetPage;
PropertySheet(SheetHeader);
end;
диалог в виде PropertySheet создаётся "на ура"
далее я обработчике одной из его форм
GeneralProc я обрабатываю несколько сообщений:
function GeneralProc(hwndDlg:HWND;uMsg:UINT;wPar:WPARAM;lPar:LPARAM):LongBool;
stdcall;
var
ElementWnd:hWND;
IconHandle:HICON;
IconDC:HDC;
begin
result:=false;
case uMSG of
WM_InitDialog:
begin
//здесь я заполняю значениями комбобоксы и выставляю начальные значения всех элементов
end;
WM_PAINT:
begin
IconHandle:=LoadIcon(plugin.hDLLInstance,'ROWS_MODE2'); //гружу из ресурсов иконку
ElementWnd:=GetDlgItem(hwndDlg,IDC_FrameBitmap); //получаю hWND элемента в диалоге
//где хочу отрисовать иконку
IconDC:=GetDC(ElementWnd); //беру hDC етого места
DrawIcon(IconDC,0,0,IconHandle); //пытаюсь рисовать
ReleaseDC(ElementWnd,IconDC); //освобождаю hDC
DestroyIcon(IconHandle);} //и удаляю hICON
end;
end;
end;
Проблема и заключается в том, что при инициализации диалога ничего не отображается,
а отображается если закрыть окно диалога любым другим окном и
тихооонько :) отодвигать ето окно... тогда также тихонько все отрисуется, но если убрать резко окно, то рисунок пропадает...
может есть более удобный способ загрузить картинку в елемент формы из ресурсов в рантайме?
как-то же реализовано это в 'проводник->свойства диска'
Вощем я сам решил свою проблему :maniac:
В ресурсах у елемента на который хотим картинку помещать указываю стиль owner-draw
и потом обрабатываю
WM_DRAWITEM таким образом:
function GeneralProc(hwndDlg:HWND;uMsg:UINT;wPar:WPARAM;lPar:LPARAM):LongBool;
stdcall;
var
FrameIconHandle:HICON;
lpDIS: ^DRAWITEMSTRUCT;
begin
result:=false;
case uMSG of
WM_InitDialog:
begin
//здесь я заполняю значениями комбобоксы и выставляю начальные значения всех элементов
end;
......
WM_DRAWITEM: if wPar=IDC_FrameBitmap then
begin
lpDIS:=ptr(lPar);
DrawIcon(lpDIS.hDC,0,0,FrameIconHandle);
end;
end;
end;
Вдруг кому понадобится Ж-) тоже, что и мне, по поиску быстро найдут... а то я неделю проблему ету решал :user: