Главная страница
    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.49 MB
Время: 0.044 c
3-1163962355
Firefly
2006-11-19 21:52
2007.02.11
Поле autoincrement в Oracle


5-1148281252
deltav1
2006-05-22 11:00
2007.02.11
TTimer


15-1169382268
NikNet
2007-01-21 15:24
2007.02.11
Где скачать редактор для SQL (sybase) с наворотами...


8-1150328699
h8394E
2006-06-15 03:44
2007.02.11
Кадры анимации


15-1169214750
FAskerQ
2007-01-19 16:52
2007.02.11
PopupMenu





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