Сейчас на форуме: tyns777, zds, JustLife (+3 невидимых)

 eXeL@B —› Программирование —› баг отображения в Windows Vista Home Premium
Посл.ответ Сообщение


Ранг: 156.2 (ветеран), 2thx
Активность: 0.090
Статус: Участник

Создано: 13 января 2010 01:46 · Поправил: Mavlyudov
· Личное сообщение · #1

Вот написал прогу, решил протестировать в Windows Vista Home Premium,
но там возникают проблемы при отрисовке. На экране видны сплошные две полосы
в полноэкранном режиме и одна полоса в режиме не на весь экран. Эти полосы сплошные
и они рисуются поверх всего остального...
Пробелы в отрисовке лежат в двух диапазонах: (255, 512) и (767, 1024)
В Windows 2000/XP всё отрисовывается нормально.
Мои предположения, что в этой винде есть какие-то поверки...
А, возможно, это связано с типом переменных(может быть, byte?).
Кто знате, подскажите.
Вот скриншоты.
hччp://www.youpic.ru./images/2010/01/12/5784526602.png
hччp://www.youpic.ru./images/2010/01/12/8615737346.png
А вот исходник.
Code:
  1. program pixline;
  2.  
  3. uses
  4.   windows;
  5.  
  6. const
  7.    WM_PAINT = $000F;
  8.    WM_DESTROY = $0002;
  9.    WM_KEYDOWN = $0100;
  10.    WM_CHAR = $0102;
  11. var
  12.   WinClass : TWndClass;
  13.   hInst : HWND;
  14.   Handle : HWND;
  15.   Msg : TMSG;
  16.   //=======
  17.   DC:hDC;
  18.   ps:PAINTSTRUCT;
  19.   rr : Trect;
  20.   br:TLogBrush;
  21.   Pen:HPen;
  22.   brush:hbrush;
  23.  
  24. procedure ShutDown;
  25. begin
  26.   UnRegisterClass(WinClass.lpszClassName, hInst);­ 
  27.   ExitProcess(hInst);
  28. end;
  29.  
  30. procedure DDALine(var hhdc:hdc; x1,y1,x2,y2:Integer);
  31. function Max0(const A, B: Integer): Integer;
  32. begin
  33.   if A > B then
  34.     Result := A
  35.   else
  36.     Result := B;
  37. end;
  38. var deltaX,deltaY,length:Integer;
  39. x,y,dx,dy:single;
  40. begin
  41.  deltaX:=abs(X1-X2);
  42.  deltaY:=abs(Y1-Y2);
  43.  length:=max0(deltaX, deltaY);
  44.  if length=0 then SetPixel(dc, X1, Y1, 0);
  45.  dX:=(x2-x1)/length;
  46.  dY:=(y2-y1)/length;
  47.  x:=x1;
  48.  y:=y1;
  49.  while (abs(x)<=deltaX) or (abs(y)<=deltay) do
  50.  begin
  51.   x:=x+dX;
  52.   y:=y+dY;
  53.   SetPixel(dc, round(x), round(y), 0);
  54.  end;
  55. end;
  56.  
  57. function WindowProc(Window: HWnd; AMessage: UINT; WParam : WPARAM;
  58.                                    LParam: LPARAM): longint; stdcall;
  59. begin
  60. Result := DefWindowProc(Window, AMessage, wparam, lparam);
  61. case AMessage of
  62. WM_KEYDOWN:
  63.    if($1B = wParam) then SendMessage(Window, wm_close, 0, 0); //ShutDown;
  64. WM_CHAR:
  65.    if($1B = wParam) then exit;
  66. WM_PAINT:
  67.    begin
  68. //    dc := BeginPaint(Window, ps);
  69.       dc := GetDC(Window);
  70.       GetClientRect(Window, rr);
  71.       Pen:=CreatePen(ps_Solid,1,RGB(255,0,0));
  72.       SelectObject(dc,Pen);
  73.       Brush := CreateSolidBrush(RGB(255,255,0));
  74.       SelectObject(dc,brush);
  75.       FillRect(DC, rr, Brush);
  76.       MoveToEx(dc,0,0,0);
  77.       LineTo(dc,rr.Right,rr.Bottom);
  78.       DDALine(dc,rr.Left,rr.Bottom,rr.Right,rr.Top);
  79. //    DDALine(dc,0,0,rr.Right,rr.Bottom);
  80.       DeleteObject(Brush);
  81.       DeleteObject(Pen);
  82. //    EndPaint(Window,ps);
  83.       ReleaseDC(Window, dc);
  84. //    DeleteDC(dc);
  85.    end;
  86. WM_SIZE:
  87.       InvalidateRect(Window,nil,False);
  88. WM_DESTROY:
  89. // PostQuitMessage(0);
  90. ShutDown;
  91.   end;
  92. end;
  93.  
  94. begin
  95. hInst := GetModuleHandle(nil);
  96.   with WinClass do
  97.   begin
  98.    Style := CS_PARENTDC;
  99.    hIcon := LoadIcon(hInstance, IDI_APPLICATION);
  100.    lpfnWndProc := @WindowProc;
  101.    hInstance := hInst;
  102.    hbrBackground := COLOR_BTNFACE + 1;
  103.    lpszClassName := 'TPixLineClass';
  104.    hCursor := LoadCursor(0, IDC_ARROW);
  105.   end;
  106. InitCommonControls;
  107. RegisterClass(WinClass);
  108. Handle := CreateWindowEx(0, WinClass.lpszClassName, 'LineTo and PutPixel',
  109. WS_OVERLAPPEDWINDOW or
  110. WS_VISIBLE,
  111. 244, 127, 696, 473,
  112. 0, 0,
  113. hInst, nil);
  114.  
  115.   while(GetMessage(Msg, Handle, 0, 0)) do
  116.   begin
  117.    TranslateMessage(Msg);
  118.    DispatchMessage(Msg);
  119.   end;
  120. end.


P.S. прикрепил(.exe) на случай, если не получится откомпилировать...
Думаю, из-под отладчика тоже получится найти проблему.

711b_12.01.2010_CRACKLAB.rU.tgz - pixline.rar


 eXeL@B —› Программирование —› баг отображения в Windows Vista Home Premium
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати