Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2012, 16:37   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию Мешающее системное меню(SysMenu) и изменение размеров формы

Добрый день. Замучился я с этой проблемой. Итак, создаю форму,
Код:
 invoke  CreateWindowEx,0,ClassName,CaptionWindow,WS_VISIBLE+WS_OVERLAPPED,CW_USEDEFAULT,CW_USEDEFAULT,500,500,NULL,NULL,[hInstance],NULL
, а на ней находится белая полоса(смотрите аттач), за которую форму можно "таскать". Как ее убрать? К тому же она мешает размещению контролов(кнопок и т.д.). Делать форму таким же цветом не хочется, т.к. я уже говорил, полоса мешает элементам управления. Хотелось бы просто форму с крестиком. Если ставить WS_OVERLAPPEDWINDOW, то меню остается,но и добавляется возможность растягивать окно. И, с вашего позволения, второй вопрос. Когда изменяешь размеры формы(тянешь за бок) и после того, как отпустил кнопку мыши, размеры ее продолжают изменяться соответственно положению курсора. Итак, как убрать SYSMENU(если это вообще оно), и сделать правильное изменение размеров формы?
С уважением _PROGRAMM_
Изображения
Тип файла: jpg Безымянный.jpg (20.0 Кб, 84 просмотров)

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 24.07.2012, 17:26   #2
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Есть хотя бы предположения?
Код:
   mov     [wc.cbSize],sizeof.WNDCLASSEX
          mov     [wc.style],CS_HREDRAW+CS_VREDRAW
          mov     [wc.cbClsExtra],0
          mov     [wc.cbWndExtra],0
          invoke  GetModuleHandleA,0
          mov     [hInstance],eax
          mov     [wc.hInstance],eax
          mov     [wc.lpfnWndProc],WndProc
          invoke  LoadIcon,NULL,IDI_APPLICATION
          mov     [wc.hIcon],eax
          mov     [wc.hIconSm],eax
          invoke  LoadCursor,NULL,IDC_ARROW
          mov     [wc.hCursor],eax
          mov     [wc.hbrBackground],COLOR_WINDOW
          mov     [wc.lpszMenuName],0
          mov     [wc.lpszClassName],ClassName
          invoke  RegisterClassEx,wc
          cmp     eax,0
          jz      exit
          mov     [pClass],eax
          invoke  CreateWindowEx,0,ClassName,CaptionWindow,WS_VISIBLE+WS_OVERLAPPED,CW_USEDEFAULT,CW_USEDEFAULT,600,500,NULL,NULL,[hInstance],NULL
          cmp     eax,0
          jz      error
          mov     [hwnd],eax
От чего оно появляется?

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 24.07.2012, 18:03   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Странно, не должно быть етой белой полосы.
Начните с того, что в регистрации класса окна поменяйте WndProc на DefWndProc и посмотрим, изчезнет полоса или нет.
waleri вне форума Ответить с цитированием
Старый 24.07.2012, 18:15   #4
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
Начните с того, что в регистрации класса окна поменяйте WndProc на DefWndProc и посмотрим, изчезнет полоса или нет.
Выбивает ошибку(возвращает 0). GetLastError тоже 0

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 24.07.2012, 20:41   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Ой, я не так написал - надо DefWindowProc
Странно, что вообще скомпилировалось...
waleri вне форума Ответить с цитированием
Старый 24.07.2012, 22:09   #6
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
Ой, я не так написал - надо DefWindowProc
Странно, что вообще скомпилировалось...
Я догадался. Там DefWindowProc и стоит. Вот с ней ошибку то и выбивает
Код:
         mov     [wc.cbSize],sizeof.WNDCLASSEX
          mov     [wc.style],CS_HREDRAW+CS_VREDRAW
          mov     [wc.cbClsExtra],0
          mov     [wc.cbWndExtra],0
          invoke  GetModuleHandleA,0
          mov     [hInstance],eax
          mov     [wc.hInstance],eax
          mov     [wc.lpfnWndProc],DefWindowProc
          invoke  LoadIcon,NULL,IDI_APPLICATION
          mov     [wc.hIcon],eax
          mov     [wc.hIconSm],eax
          invoke  LoadCursor,NULL,IDC_ARROW
          mov     [wc.hCursor],eax
          mov     [wc.hbrBackground],COLOR_WINDOW
          mov     [wc.lpszMenuName],0
          mov     [wc.lpszClassName],ClassName
          invoke  RegisterClassEx,wc
          cmp     eax,0
          jz      exit
          mov     [pClass],eax
          invoke  CreateWindowEx,0,ClassName,CaptionWindow,WS_VISIBLE+WS_OVERLAPPED,CW_USEDEFAULT,CW_USEDEFAULT,600,500,NULL,NULL,[hInstance],NULL
          cmp     eax,0
          jz      error
          mov     [hwnd],eax
.......................................
error:   invoke  GetLastError
          invoke  wsprintf,geterror,'%d',eax
          invoke  MessageBox,0,geterror,Caption,0

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 24.07.2012 в 22:12.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 25.07.2012, 07:58   #7
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Чуть чуть подумав, и изменив код, все-таки удалось подставить DefWindowProc. Полоса исчезла. Какие дальнейшие действия?
Код:
  mov     [wc.style],0
          mov     [wc.cbClsExtra],0
          mov     [wc.cbWndExtra],0
          invoke  GetModuleHandleA,NULL
          mov     [hInstance],eax
          mov     [wc.hInstance],eax
          mov     eax,[DefWindowProc]
          mov     [wc.lpfnWndProc],eax
          invoke  LoadIcon,NULL,IDI_APPLICATION
          mov     [wc.hIcon],eax
          invoke  LoadCursor,NULL,IDC_ARROW
          mov     [wc.hCursor],eax
          mov     [wc.hbrBackground],COLOR_WINDOW
          mov     [wc.lpszMenuName],NULL
          mov     [wc.lpszClassName],ClassName
          invoke  RegisterClass,wc
          cmp     eax,0
          jz      exit
          mov     [pClass],eax
          invoke  CreateWindowEx,0,ClassName,CaptionWindow,WS_VISIBLE+WS_OVERLAPPEDWINDOW,100,100,500,500,NULL,NULL,[hInstance],NULL
          cmp     eax,0
          jz      error
          mov     [hWnd],eax
Нужно, чтобы с WndProc работала.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 25.07.2012 в 08:08.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 25.07.2012, 08:40   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Чиним WndProc.
Убираем из WndProc все, кроме вызова DefWindowProc и начинаем возвращать шаг за шагом и смотрим когда полоса появится вновь.
waleri вне форума Ответить с цитированием
Старый 25.07.2012, 09:44   #9
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

waleri, спасибо огромное. Дело было в двойном вызове DefWindowProc . Вот каким образом была сделана WndProc(это желающим).
Код:
proc WndProc,hwnd,msg,wParam,lParam

         push    ebx esi edi

         cmp     [msg],WM_DESTROY
         jz      wmdestroy
         cmp     [msg],WM_CREATE
         jz      wmcreate
         cmp     [msg],WM_COMMAND
         jz      click
         invoke  DefWindowProc,[hwnd],[msg],[wParam],[lParam]
         jmp     finish

wmcommand:

         cmp  WORD[wParam+2], BN_CLICKED
         jz   click
         jmp  finish

click:

         cmp     WORD[wParam],checkbox
         jz      setcheck
         cmp     WORD[wParam],button1
         jnz     finish
         invoke  MessageBox,0,'Âû íàæàëè êíîïêó','Âíèìàíèå',0
         jmp     finish

setcheck:

         invoke  SendMessage,[lParam],BM_SETCHECK,1,0
         invoke  MessageBox,0,'Âû óñòàíîâèëè ÷åê','Âíèìàíèå',0
         jmp finish

wmcreate:

         invoke  CreateWindowEx,0,'button','Ïðèâåò',WS_VISIBLE+WS_CHILD+BS_DEFPUSHBUTTON+WS_TABSTOP, \
         120,10,120,50,[hwnd],button1,[hInstance],NULL

         invoke  CreateWindowEx,0,'button','Ôëàæîê',WS_VISIBLE+WS_CHILD+BS_CHECKBOX, \
         0,0,100,20,[hwnd],checkbox,[hInstance],NULL

         invoke  CreateWindowEx,0,'edit',NULL,WS_VISIBLE+WS_CHILD+WS_BORDER+ES_MULTILINE+ES_AUTOVSCROLL, \
         0,0,200,400,[hwnd],,[hInstance],NULL
         cmp     eax,0
         jz      error
         jmp     finish

wmdestroy:

         invoke  PostQuitMessage,0
         xor     eax,eax

finish:

        pop     edi esi ebx
        invoke  DefWindowProc,[hwnd],[msg],[wParam],[lParam]
        ret
        endp
Кстати проблема с растягиванием окна тоже решилась. Еще раз спасибо.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение размеров формы Lader C# (си шарп) 3 24.10.2011 14:01
Системное Меню Claster Помощь студентам 0 06.07.2011 15:03
Системное меню kolom1990 Помощь студентам 0 11.04.2011 14:52
Системное меню в тулбаре Пропеллер Общие вопросы Delphi 0 16.05.2010 22:42
Запретить изменение размеров формы larin1974 Общие вопросы Delphi 9 12.09.2009 20:27