Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.11.24;
Скачать: [xml.tar.bz2];

Вниз

Отчего мусор на экране после 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.11.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.011 c
14-79124
Style
2003-10-28 16:13
2003.11.24
SM80, SM300


14-79129
MPS
2003-11-01 15:07
2003.11.24
Группы новостей


3-78807
Konuhov Sergey
2003-11-03 22:25
2003.11.24
В paradox-е, файл остается заблокированным.


1-78984
qwe
2003-11-14 13:04
2003.11.24
как изменить высоту заголовка в TListView??


1-79021
ChecheNeC
2003-11-14 22:41
2003.11.24
RxRichEdit





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский