![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глюк с перерисовкой окна [D6, Win95/98, WinXP]
Dib@zol © (2006-09-28 18:30:00)Помогите плз. У меня на компе 2 винды - 98 и Икс Пи. Дык вот, я тут написал прогу, на API, создающую окно. В 98-ом всё шло нормально, а вот в XP поперли глюки :( - при перемещении окна частично за пределы десктопа, по возвращении назад эта область не переисовыалась, и была заполнена цветом границы окна, причем не только клиентская - заголовок тоже!!! Пипл, памагите советом, коли кто встречал такой баг, как с ним бороться!
Eraser (2006-09-29 19:10:00) [1]> [8] Dib@zol (29.09.06 18:50)
> Чушь а не код говоришь? А если TLabel это самостоятельно
> определённая константа, равная 'STATIC'
не лучше :)
Dib@zol (2006-09-29 18:50:00) [2]> > CreateWindow(TLabel, ...
Чушь а не код говоришь? А если TLabel это самостоятельно определённая константа, равная 'STATIC' те. идентификатору метки в API? Тоже чушь? Ну да это я так к слову. Извините мужики связь хреновая. Тем более из инет-кафе. Вобщем вот он максимально обкорнатый код:
program WinXPGluk;
uses
Windows, Messages;
const
AppName = 'Gluk_Win:(';
Var
Window : HWnd;
Message : TMsg;
WindowClass : TWndClass;
function WindowProc (Window : HWnd; Message, WParam : Word;
LParam : LongInt) : LongInt; stdcall;
var
XPos, YPos : Integer;
wrkPChar : PChar;
begin
WindowProc := 0;
case Message of
wm_Destroy : begin
PostQuitMessage (0);
Exit;
end;
end; // case
WindowProc := DefWindowProc (Window, Message, WParam, LParam);
end;
begin
with WindowClass do begin
Style := cs_HRedraw or cs_VRedraw;
lpfnWndProc := @WindowProc;
cbClsExtra := 0;
cbWndExtra := 0;
hInstance := 0;
hIcon := LoadIcon (0, idi_Application);
hCursor := LoadCursor (0, idc_Arrow);
hbrBackground := CreatesolidBrush(GetSysColor(Color_btnface));
lpszMenuName := '';
lpszClassName := AppName;
end;
If RegisterClass (WindowClass) = 0 then Halt (255);
Window := CreateWindow (AppName, '<-- Передвинь туда и увидишь Глюк...', ws_OverlappedWindow,
cw_UseDefault, cw_UseDefault,
cw_UseDefault, cw_UseDefault,
0, 0, HInstance, nil);
ShowWindow (Window, CmdShow);
UpdateWindow (Window);
while GetMessage (Message, 0, 0, 0) do begin
TranslateMessage (Message);
DispatchMessage (Message);
end;
Halt (Message.wParam);
end.
Eraser (2006-09-28 19:04:00) [3]> CreateWindow (TLabel,
это, уж извини, чушь, а не код.
Посмотри нормальные примеры Win32 API приложений. В сети полно.
Ketmar (2006-09-28 19:04:00) [4]>[6] Eraser(c) 28-Sep-2006, 19:04
>это, уж извини, чушь, а не код.
так я к тому же подвожу. соберёт "скелет". "скелет" заработает. потом будет наращивать постепенно. так, глядишь, и получится нечто удобоваримое.
Ketmar (2006-09-28 18:54:00) [5]много буковок. ниасилил. будь любезен, сократи до самого минимума. чтобы скопировал, вставил, скомпилял, запустил и -- опа! вот он, баг.
Dib@zol (2006-09-28 18:50:00) [6]procedure EnableMusic(bPlay:boolean);
begin
if bPlay then begin
CheckMenuItem(MOptn, BtMusic, MF_BYCOMMAND or MF_CHECKED);
end else begin
CheckMenuItem(MOptn, BtMusic, MF_BYCOMMAND or MF_UNCHECKED);
end;
PlayMus:=bPlay;
end;
procedure EnableSound(bPlay:boolean);
begin
if bPlay then begin
CheckMenuItem(MOptn, BtSound, MF_BYCOMMAND or MF_CHECKED);
end else begin
CheckMenuItem(MOptn, BtSound, MF_BYCOMMAND or MF_UNCHECKED);
end;
PlaySnd:=bPlay;
end;
procedure AutoBudget(ab:boolean);
begin
if ab then begin
CheckMenuItem(MOptn, BtABud, MF_BYCOMMAND or MF_CHECKED);
end else begin
CheckMenuItem(MOptn, BtABud, MF_BYCOMMAND or MF_UNCHECKED);
end;
ABudget:=ab;
end;
procedure InitFirstPanel;
var bXW, bYW, meH, caH:byte;
lf:TLogFont;
Font, WrkFont:HFONT;
dc:HDC;
begin
bXW:=GetSystemMetrics(SM_CXFIXEDFRAME);
bYW:=GetSystemMetrics(SM_CYFIXEDFRAME);
meH:=GetSystemMetrics(SM_CYMENU);
caH:=GetSystemMetrics(SM_CYCAPTION);
PanelMain:=CreateWindow (TLabel, '', WS_VISIBLE or WS_CHILD
or SS_ETCHEDFRAME, -1, -1, WInitWid-bXW-bXW+2,
WInitHei-bYW-bYW-meH-caH+2, Window, 0, hInstance, nil);
PicIntro:=CreateWindow (TLabel, 'ZASTAVKA',
WS_VISIBLE or WS_CHILD or SS_BITMAP or SS_NOTIFY,
9, 9, 1, 1, PanelMain, 0, hInstance, nil);
EdInput:=CreateWindowEx (WS_EX_CLIENTEDGE, TEdit, '',
WS_VISIBLE or WS_CHILD or ES_CENTER,
160, 111, 150, 24, PanelMain, 0, hInstance, nil);
btAccept:=CreateWindow (TButton, 'Ввести',
WS_VISIBLE or WS_CHILD or BS_CENTER,
120, 144, 81, 25, PanelMain, 0, hInstance, nil);
{ FillChar(lf, SizeOf(lf), 0);
lf.lfHeight := -28 ;
lf.lfWeight := FW_NORMAL ;
lf.lfCharSet := ANSI_CHARSET ;
lf.lfOutPrecision := OUT_DEFAULT_PRECIS ;
lf.lfClipPrecision := CLIP_DEFAULT_PRECIS ;
lf.lfQuality := DEFAULT_QUALITY ;
lf.lfPitchAndFamily := FF_DONTCARE OR DEFAULT_PITCH;
lstrcpy (lf.lfFaceName, 'Arial') ;
Font := CreateFontIndirect(lf);
DC:=getDC(LblName);
WrkFont:=SelectObject(DC, Font);
PostMessage(LblName, WM_SETFONT, WrkFont, -1);}
LblName:=CreateWindow (TLabel, 'Сюды вводють имя:',
WS_VISIBLE or WS_CHILD or SS_CENTER,
9, 114, 140, 20, PanelMain, 0, hInstance, nil);
{UpdateWindow(LblName);
TextOut(DC, 2, 2, 'sdrgtsdg', 8);}
end;
function WindowProc (Window : HWnd; Message, WParam : Word;
LParam : LongInt) : LongInt; stdcall;
var
XPos, YPos : Integer;
wrkPChar : PChar;
sX, sY:string;
begin
WindowProc := 0;
case Message of
WM_CREATE:
begin
InitMenus;
SetMenu(Window, MMain);
DrawMenuBar(Window);
Randomize;
end;
WM_DESTROY:
begin
DestroyWindow(PicIntro);
DestroyWindow(LblName);
DestroyWindow(EdInput);
DestroyWindow(btAccept);
DestroyWindow(PanelMain);
DeInitMenus;
PostQuitMessage (0);
Exit;
end;
// реакция на сообщение - двойной щелчок на окне
WM_LBUTTONDBLCLK:
begin
{xpos := LoWord ( LParam );
ypos := HiWord ( LParam );
str(xpos, sX);
str(ypos, sY);
wrkPChar := PChar ( 'X = ' + sX + ', Y = ' + sY );
MessageBox (0, wrkPChar, 'Двойной щелчок', mb_OK);}
end;
WM_CLOSE: begin
if MessageBox(Window, PChar(ExitStr[random(Length(ExitStr))+1]+#13+'Да - выход, Нет - возврат'), 'Неужели уже всё?', MB_ICONQUESTION or MB_YESNO or MB_APPLMODAL or MB_DEFBUTTON2)=idYes then
NeedToHalt:=true;
end;
WM_COMMAND: // Menu click analysis
begin
case LOWORD(wParam) of
BtExit: SendMessage(Window, WM_CLOSE, 0, 0);
BtMusic: EnableMusic(not PlayMus);
BtSound: EnableSound(not PlaySnd);
BtABud: AutoBudget(not ABudget);
end;
end;
end; // case
if (Message<>WM_CLOSE) or ((Message=WM_CLOSE)and(needToHalt)) then
WindowProc := DefWindowProc (Window, Message, WParam, LParam);
end;
begin
with WClass do begin
Style := CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS;
lpfnWndProc := @WindowProc;
cbClsExtra := 0;
cbWndExtra := 0;
hInstance := sysInit.HInstance;
hIcon := LoadIcon (hInstance, 'MAINICON');
hCursor := LoadCursor (0, idc_Arrow);
hbrBackground := CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
lpszMenuName := '';
lpszClassName := AppName;
end;
If RegisterClass (WClass) = 0 then Halt (255);
WXPos:=round((GetSystemMetrics(SM_CXSCREEN)-WInitWid)/2);
WYPos:=round((GetSystemMetrics(SM_CYSCREEN)-WInitHei)/2);
Window := CreateWindow (AppName, WndName, WS_CAPTION or
WS_SYSMENU or WS_MINIMIZEBOX or WS_VISIBLE or DS_SETFONT, WXPos, WYPos,
WInitWid, WInitHei, 0, 0, HInstance, nil);
InitFirstPanel;
ShowWindow (Window, CmdShow);
UpdateWindow (Window);
while GetMessage (Message, 0, 0, 0) do begin
TranslateMessage (Message);
DispatchMessage (Message);
end;
Halt (Message.wParam);
end.
Ketmar (2006-09-28 18:41:00) [7]а мне телепатор говорит, что где-то неверная работа с DC...
проверим, чей телепатор круче. %-)
Ketmar (2006-09-28 18:36:00) [8]17-z строка, вестимо.
Eraser (2006-09-28 18:36:00) [9]> [0] Dib@zol (28.09.06 18:30)
телепатор говорит, что проблемы скорее всего с обработкой сообщения WM_ERASEBKGND.
показывай код.