Окно на Си и на Vb6: в чем разница?

Обсуждения по программированию для ОС Windows безотносительно используемого языка программирования. Windows NT, Win32, Windows API, ядро и драйверы.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Окно на Си и на Vb6: в чем разница?

Сообщение arthur2 » 24.12.2010 (Пт) 9:18

На Си создал окно и присвоил ему регион. При таскании это окно сильно размазывается по экрану. В коде ничего особенного (практически, вообще никакого кода нет):
Код: Выделить всё
      #include <windows.h>
      #pragma comment(lib, "user32.lib")
      #pragma comment(lib, "gdi32.lib")
       
      LRESULT CALLBACK WndFrmProc(HWND,UINT,WPARAM,LPARAM);
       
      int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
                ,LPSTR lpszCmdParam,int nCmdShow)
      {
       
          HWND hWnd;
          MSG Message;
          WNDCLASS WndClass;
       
          WndClass.cbClsExtra=0;
          WndClass.cbWndExtra=0;
          WndClass.hbrBackground=(HBRUSH)(HOLLOW_BRUSH);
          WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
          WndClass.hIcon=LoadIcon(NULL, IDI_APPLICATION);
          WndClass.hInstance=hInstance;
          WndClass.lpfnWndProc=(WNDPROC)WndFrmProc;
          WndClass.lpszClassName="lalala";
          WndClass.lpszMenuName=NULL;
          WndClass.style=CS_SAVEBITS;
          RegisterClass(&WndClass);
hWnd=CreateWindow("lalala","trampampam",WS_OVERLAPPEDWINDOW,
                100,100,500,500,
                NULL,(HMENU)NULL,hInstance,NULL);
          HRGN rg = CreateEllipticRgn(0,0,500,500);
          SetWindowRgn(hWnd,rg,TRUE);
       
          ShowWindow(hWnd,nCmdShow);
       
          while(GetMessage(&Message,0,0,0)) {
                  TranslateMessage(&Message);
                  DispatchMessage(&Message);
          }
          return Message.wParam;
      }

      // Main Frame Window
      LRESULT CALLBACK WndFrmProc(HWND hwnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
      {
          switch (iMessage)      /* handle the messages */
          {
          case WM_RBUTTONUP:
          case WM_DESTROY:
              PostQuitMessage(0);       /* send a WM_QUIT to the message queue */
              break;
          default:                      /* for messages that we don't deal with */
              return DefWindowProc(hwnd, iMessage, wParam, lParam);
          } 
       
      }

Аналогичное окно на бейсике ведёт себя гораздо приличнее.
Код: Выделить всё
      Option Explicit
      Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
      Private Declare Function CreateEllipticRgn Lib "gdi32" _
                      (ByVal X1 As Long, ByVal Y1 As Long, _
                       ByVal X2 As Long, ByVal Y2 As Long) As Long
      Private Sub Form_Load()
          Me.Width = 500 * Screen.TwipsPerPixelX
          Me.Height = 500 * Screen.TwipsPerPixelY
          Dim rg As Long
          rg = CreateEllipticRgn(0, 0, 500, 500)
          SetWindowRgn hWnd, rg, True
      End Sub
       
      Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
      End
      End Sub

С чем это может быть связано?

Думаю, что со стилями окна или класса. Пробовал разные флаги, но как-то малоуспешно. Посоветуйте, какую комбинацию стилей подобрать?
Вложения
vb6cpp.zip
(4.28 Кб) Скачиваний: 276
Артур
 
   

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Окно на Си и на Vb6: в чем разница?

Сообщение SLIM » 24.12.2010 (Пт) 12:48

Я не вижу размазывания.
Пишите жизнь на чистовик.....переписать не удастся.....

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: Окно на Си и на Vb6: в чем разница?

Сообщение BV » 24.12.2010 (Пт) 13:31

arthur2 писал(а):Думаю, что со стилями окна или класса. Пробовал разные флаги, но как-то малоуспешно.

Все стили, что устанавливает VB6 для ThunderRT6Form, можно подсмотреть в любом оконном шпионе, вроде Spy++.
И вообще, зачем создавать здесь еще одну тему? Этой мало http://forum.sources.ru/index.php?showtopic=321921 ?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Окно на Си и на Vb6: в чем разница?

Сообщение Хакер » 24.12.2010 (Пт) 14:09

arthur2 писал(а):
Код: Выделить всё
          while(GetMessage(&Message,0,0,0)) {
                  TranslateMessage(&Message);
                  DispatchMessage(&Message);
          }

Вот за такое надо бить по рукам.

У меня окна оба в равной степени оставляют мусор под собой: мало — на большинстве, очень много — на FireFox-е.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Окно на Си и на Vb6: в чем разница?

Сообщение arthur2 » 24.12.2010 (Пт) 14:52

SLIM писал(а):Я не вижу размазывания.
У меня машина старая - может поэтому. Вопрос не столько в размазывании, сколько в том, почему первое окно мажется сильнее, чем второе.

можно подсмотреть в любом оконном шпионе, вроде Spy++.
Посмотрел и поставил те же значения. Вроде бы, вообще ничего не изменилось. Может, всё же не в стилях дело?

И вообще, зачем создавать здесь еще одну тему? Этой мало
Там уже, вроде, высказались все, кто хотел :)
Вот за такое надо бить по рукам.
А что не так? :oops:
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Окно на Си и на Vb6: в чем разница?

Сообщение Хакер » 24.12.2010 (Пт) 15:25

arthur2 писал(а):А что не так? :oops:

Это не сверхзнания, это информация, которую можно узнать просто читая справку по GetMessage.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Окно на Си и на Vb6: в чем разница?

Сообщение arthur2 » 24.12.2010 (Пт) 16:16

То, что GetMessage может вернуть -1? Учту :)

Вообще-то, так генерируют визарды:
VC++6 писал(а):
Код: Выделить всё
   // Main message loop:
   while (GetMessage(&msg, NULL, 0, 0))
   {
      if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
      {
         TranslateMessage(&msg);
         DispatchMessage(&msg);
      }
   }

Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Окно на Си и на Vb6: в чем разница?

Сообщение Хакер » 24.12.2010 (Пт) 16:23

arthur2 писал(а):Вообще-то, так генерируют визарды:

Ну и в топку их. Самый лучший визард живёт в черепной коробке.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Окно на Си и на Vb6: в чем разница?

Сообщение arthur2 » 24.12.2010 (Пт) 16:42

Ну надо же от чего-то плясать :) Как освоюсь - можно будет и без визардов.

А по теме есть соображения?
Артур
 
   

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: Окно на Си и на Vb6: в чем разница?

Сообщение BV » 24.12.2010 (Пт) 20:48

arthur2 писал(а):Там уже, вроде, высказались все, кто хотел

Ты же, как бы, своим последним постом закрыл тему. До тех пор, пока не наиграешься со стилями. Вот никто и не отвечает
А разводов не должно быть в принципе. Я думаю, что тут надо бороться с проблемой, а не с тем, почему одно окно вызывает проблему не так сильно, как другое.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Окно на Си и на Vb6: в чем разница?

Сообщение arthur2 » 24.12.2010 (Пт) 22:35

Ну, судя по тому, что проблема только у меня, оставим пока всё как есть (в смысле кода). А апгрейд в ближайшее время я всё равно не планирую :(
Артур
 
   


Вернуться в Windows-программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList