Текущий архив: 2007.02.11;
Скачать: CL | DM;
ВнизГлюк с перерисовкой окна Найти похожие ветки
← →
Dib@zol (2006-09-28 18:30) [0]Помогите плз. У меня на компе 2 винды - 98 и Икс Пи. Дык вот, я тут написал прогу, на API, создающую окно. В 98-ом всё шло нормально, а вот в XP поперли глюки :( - при перемещении окна частично за пределы десктопа, по возвращении назад эта область не переисовыалась, и была заполнена цветом границы окна, причем не только клиентская - заголовок тоже!!! Пипл, памагите советом, коли кто встречал такой баг, как с ним бороться!
← →
Ketmar © (2006-09-28 18:36) [1]17-z строка, вестимо.
← →
Eraser © (2006-09-28 18:36) [2]> [0] Dib@zol (28.09.06 18:30)
телепатор говорит, что проблемы скорее всего с обработкой сообщения WM_ERASEBKGND.
показывай код.
← →
Ketmar © (2006-09-28 18:41) [3]а мне телепатор говорит, что где-то неверная работа с DC...
проверим, чей телепатор круче. %-)
← →
Dib@zol (2006-09-28 18:50) [4]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:54) [5]много буковок. ниасилил. будь любезен, сократи до самого минимума. чтобы скопировал, вставил, скомпилял, запустил и -- опа! вот он, баг.
← →
Eraser © (2006-09-28 19:04) [6]> CreateWindow (TLabel,
это, уж извини, чушь, а не код.
Посмотри нормальные примеры Win32 API приложений. В сети полно.
← →
Ketmar © (2006-09-28 19:04) [7]>[6] Eraser(c) 28-Sep-2006, 19:04
>это, уж извини, чушь, а не код.
так я к тому же подвожу. соберёт "скелет". "скелет" заработает. потом будет наращивать постепенно. так, глядишь, и получится нечто удобоваримое.
← →
Dib@zol (2006-09-29 18:50) [8]> > 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-29 19:10) [9]> [8] Dib@zol (29.09.06 18:50)
> Чушь а не код говоришь? А если TLabel это самостоятельно
> определённая константа, равная "STATIC"
не лучше :)
Страницы: 1 вся ветка
Текущий архив: 2007.02.11;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.04 c