Текущий архив: 2003.11.24;
Скачать: CL | DM;
Вниз
Отчего мусор на экране после WinApiшного окна? Найти похожие ветки
← →
Aleksandr (2003-09-24 19:02) [0]Я создаю окно, пишу в него тексты (окно с закругленными краями), потом закрываю и... уголки от скруглений остаются видны на том, что лежало снизу. Код отрисовки текста:
function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam) : Lresult; stdcall;
var
R : TRect;
DC : HDC;
rgn : HRGN;
s : string;
P : size;
begin
case msg of
{...}
wm_SetUserText :
begin
Result:=0;
DC:=GetDC(WaitFormHandle);
try
rgn:=CreateRoundRectRgn(0,0,WaitWidth+2,72,15,15);
try
SetWindowRgn(WaitFormHandle,rgn,false);
FillRgn(DC,rgn,RGB(255, 0, 0));
R.Left:=0;
R.Top:=10;
R.Right:=WaitWidth; //WaitWidth - ширина, с которой окно создавалось
R.Bottom:=70;
FrameRgn(DC,rgn,RGB(255, 0, 0),WaitWidth,70);
repeat
s:=s+" ";
GetTextExtentPoint32(DC,PChar(s),length(s),P)
until P.cx>=WaitWidth-2;
//это заполнилась строка пробелов для вывода на окно, иначе если предыдущий текст был длиннее нового, то следы от него останутся
DrawText(DC,PChar(s),-1,R,dt_Center+dt_VCenter);
s:=StrPas(PChar(wParam));
StrDispose(PChar(wParam));
DrawText(DC,PChar(s),-1,R,dt_Center+dt_VCenter+DT_END_ELLIPSIS)
finally
DeleteObject(RGN)
end
finally
ReleaseDC(Wnd,DC)
end
end;
else
Result:=DefWindowProc(wnd,msg,wparam,lparam)
end
End;
← →
Игорь Шевченко (2003-09-25 10:50) [1]http://www.delphikingdom.com/treasury/hsdialogs.htm
Там не остаются углы :)
← →
Aleksandr (2003-09-25 13:09) [2]Знаете, с удовольствием воспользуюсь Вашими компонентами, но не в данном случае. Во-первых, окно чисто статистическое, оно есть, пока идет загрузка программы и потом само же снимается... Во-вторых, хотелось бы определиться в природе ошибки, потому как эти уголки на главной форме, оставшиеся от этого окна - это уже "фирменный знак" моих программ, а в будущем от ее использования я отказываться бы не хотел. Да и вообще что-то непонятно работает и этой отрисовкой окна - периодически, например, оно вообще прямоугольным становится, иногда слетают установленные для экрана песочные часы после отрисовки - причем меняется это от компиляции к компиляции...
← →
Игорь Шевченко (2003-09-25 13:22) [3]Не в тот момент рисование происходит. А в какой момент - по данному коду понять нельзя
← →
Aleksandr (2003-09-25 16:29) [4]Гм... помимо этого кода, есть истчо только код создания самого окна:
function CreateWaitForm(aMainHandle : HWND; xPos,yPos,nWidth,nHeight : Integer; const Title : string) : HWND;
var
s : string;
begin
if Title="" then
s:=h_DefTitle
else
s:=Title;
WaitWidth:=nWidth;
MainHandle:=aMainHandle;
wc.cbSize:=sizeof(wc);
wc.style:=cs_hredraw or cs_vredraw OR CS_NOCLOSE;
wc.lpfnWndProc:=@WindowProc;
wc.cbClsExtra:=0;
wc.cbWndExtra:=0;
wc.hInstance:=HInstance;
wc.hIcon:=0;// LoadIcon(0,idi_application);
wc.hCursor:=0;//LoadCursor(0,idc_arrow);
wc.hbrBackground:=COLOR_CAPTIONTEXT+1;
wc.lpszMenuName:=nil;
wc.lpszClassName:="WaitForm";
RegisterClassEx(wc);
WaitFormHandle:=CreateWindowEx(0, "WaitForm", PChar(s), 0,xPos,yPos,nWidth,nHeight, aMainHandle, 0, Hinstance, nil);
Result:=WaitFormHAndle;
ShowWindow(WaitFormHandle,SW_SHOWDEFAULT)
end;
Усе... Помимо этого, обрабатывается сообщение wm_Destroy и раздел interface
← →
[lamer]Barmaglot (2003-09-25 16:59) [5]Ээээ, я чего то не понял, у тебя чего нет обработки сообщений WM_Paint, WM_ERASEBKGND?
← →
Aleksandr (2003-09-26 04:31) [6]Нет... а что? %(
← →
[lamer]Barmaglot (2003-09-26 09:26) [7]Вообще-то такие вещи как изменение вида делаются в обработчике WM_Paint или WM_ERASEBKGND, попробуй перенести рисование туда.
← →
Aleksandr (2003-09-26 11:49) [8]Знаете, я попробовал на WM_Paint перенести рисование. Он намертво заклинивается, такое ощущение, что рисовка на этом событии опять порождает это событие.
← →
[lamer]Barmaglot (2003-09-26 13:27) [9]Ладно, видимо все таки придется поработать...
Вот код который я нашел у себя. Попробуй сделать что-то типа этого, о результате сообщай...
var
r, r1: hRgn;
wm_Create:
begin
r := CreateEllipticRgn(0, 0, 400, 200);
r1 := CreateRoundRectRgn(150, 60, 250, 140, 20, 10);
CombineRgn(r, r1, r, RGN_XOR);
SetWindowRgn(hWnd, r, true);
end;
← →
Aleksandr (2003-09-29 17:04) [10]Млин, нихрена хорошего не выходит... То окно "скачет" - от прямоугольного к обтекаемому, то под обтекаемым какие-то черные уголки высвечиваются... :( Объясните мне, люди, на перехвате каких сообщений и что я должен делать!
← →
Игорь Шевченко (2003-09-29 17:35) [11]Чарльза Петцольда читать. Он объяснит.
Страницы: 1 вся ветка
Текущий архив: 2003.11.24;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.009 c