Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.042 c
15-1169040549
kudatsky
2007-01-17 16:29
2007.02.11
Файл Rtl70.bpl


15-1169546778
Сало
2007-01-23 13:06
2007.02.11
Маразм по-харьковски


15-1169150541
Cyrax
2007-01-18 23:02
2007.02.11
Общий принцип организации виртуальных методов и...


2-1169645465
Графика
2007-01-24 16:31
2007.02.11
Метод канвы TextOut


15-1169137216
Kostafey
2007-01-18 19:20
2007.02.11
SQL-запрос на выборку нескольких наибольших/наименьших значений