Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.024 c
4-79234
plyaznik
2003-09-28 02:07
2003.11.24
Как реализовать Application.ProcessMessages на WinApi?(-)


3-78814
Макаров П.
2003-11-04 15:22
2003.11.24
обновлять индексы


1-79039
Vitalik
2003-11-12 21:33
2003.11.24
Package?


14-79137
ZeroDivide
2003-10-31 13:05
2003.11.24
Кто как себя заставляет писать прогу, если она кошмарно скушная?


14-79156
Стьюдент
2003-10-31 11:52
2003.11.24
Программы будующего