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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2010, 23:10   #1
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию Приделываю меню к диалоговому окну. Как!!?

Здравствуйте. Имеется программа xor-шифрования (спасибо за помощь товарищу Ulex), в которой ввод-вывод организован в диалоговом окне. А как приделать к диалоговому окну меню? Прошу помощи, ибо излазил весь Гугл - не нашел даже малейшего примера.
Вот код .ASM файла:
Код:
.686
	.model flat,stdcall
	option casemap:none
	include C:\masm32\include\windows.inc
	include C:\masm32\include\masm32.inc
	include C:\masm32\include\kernel32.inc
	include C:\masm32\include\fpu.inc
	include C:\masm32\include\user32.inc
	includelib C:\masm32\lib\masm32.lib
	includelib C:\masm32\lib\user32.lib
	includelib C:\masm32\lib\kernel32.lib
	includelib C:\masm32\lib\fpu.lib

ConfigDialog PROTO :DWORD,:DWORD,:DWORD,:DWORD

.const
ID_SPEED  equ 201
ID_XPOS	  equ 202
ID_SPEED2 equ 203
ID_XPOS2 equ 204
BSIZE equ 15
BUFMAX equ 128
IDOK2 equ 3

.data
key db 5 dup(?)
DlgName	db "CONFIG",0
;strr		db "Что угодно",0
Delay		dd 7
hInstance 	dd ?
str1 dd ?
hWnd DWORD ?
inst db BUFMAX dup(?)
lg dd ?
strsize DWORD ?
stdout DWORD ?
cWritten DWORD ?
stdin DWORD ?
cRead DWORD ?
buf db BUFMAX dup(0)
inst1 db BUFMAX dup(?)
fName BYTE "kurs.txt",0
fName1 BYTE "kurs1.txt",0
fHandle DWORD ?

.code
start:
invoke GetModuleHandle, NULL 
mov hInstance, eax 
invoke DialogBoxParam, hInstance, addr DlgName, NULL, addr ConfigDialog, 0
	invoke ExitProcess, NULL

ConfigDialog proc hDlg:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
.if uMsg==WM_INITDIALOG  
invoke ShowWindow, hDlg, SW_NORMAL 

.elseif uMsg==WM_COMMAND 
	.if wParam==IDOK	
	invoke GetDlgItemText, hDlg,ID_SPEED, addr inst,BUFMAX
	invoke GetDlgItemInt, hDlg,ID_XPOS, addr key,5
	invoke lstrlen, offset inst
	;sub eax,2
		mov lg,eax
		mov ecx,lg
		lea esi,inst
	L1:
		mov bl, byte ptr [esi]
		xor bl,key
		mov byte ptr [esi],bl
		inc esi
		loop L1
		lea esi,inst
		invoke CreateFile, ADDR fName,\	
		GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,0				;запись в Файл
		mov fHandle,eax
	invoke WriteFile,fHandle,esi,BUFMAX,ADDR cWritten, NULL
	invoke CloseHandle, fHandle
	.elseif wParam==IDOK2
	invoke GetDlgItemInt, hDlg,ID_XPOS2, addr key,5
	invoke CreateFile, ADDR fName, GENERIC_READ,0,NULL,OPEN_EXISTING,\
		FILE_ATTRIBUTE_NORMAL,0													;считывание с файла
		mov fHandle,eax
	invoke ReadFile,\
		fHandle, ADDR inst1,BUFMAX,ADDR cRead, NULL
	invoke lstrlen, offset inst1
		mov ecx,eax
		lea esi,inst1
	L2:
		mov bl, byte ptr [esi]
		xor bl,key
		mov byte ptr [esi],bl
		inc esi
		loop L2
		lea esi,inst1
		invoke SetDlgItemText, hDlg, ID_SPEED2, addr inst1
		
	.elseif wParam==IDCANCEL	; Кнопка "Отмена"
		invoke SendMessage, hDlg, WM_CLOSE, 0, 0
	.endif

.elseif uMsg==WM_CLOSE	 ;При закрытии 
	invoke EndDialog, hDlg, NULL

.else
	mov eax, FALSE
	ret
.endif
	mov eax, TRUE
	ret
ConfigDialog endp

end start
.RC файл:

Код:
#define ID_SPEED 201
#define ID_XPOS 202
#ifndef IDOK
  #define IDOK 1
#endif
#ifndef IDCANCEL
  #define IDCANCEL 2
#endif
#ifndef IDOK2 
 #define IDOK2 3
#endif
#define ID_CPT 301
#define ID_XPOS2 204
#define ID_SPEED2 203
#define IDC_STC1 1003
#define IDC_STC2 1004
#define IDOK2 3
#define ID_CPT2 302

#include "C:/masm32/include/resource.h"

CONFIG DIALOGEX 129,21,255,189
CAPTION "Программа шифрования"
FONT 8,"MS Sans Serif",0,0,0
STYLE WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU|DS_MODALFRAME
EXSTYLE WS_EX_DLGMODALFRAME
BEGIN
  CONTROL "Строка для шифрования: ",100,"Static",WS_CHILDWINDOW|WS_VISIBLE|WS_GROUP,24,21,93,12
  CONTROL "",ID_SPEED,"Edit",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP,132,21,111,12,WS_EX_CLIENTEDGE
  CONTROL "Ключ для шифрования: ",101,"Static",WS_CHILDWINDOW|WS_VISIBLE|WS_GROUP,24,36,81,12
  CONTROL "",ID_XPOS,"Edit",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP,132,36,36,12,WS_EX_CLIENTEDGE
  CONTROL "OK",IDOK,"Button",WS_CHILDWINDOW|WS_VISIBLE|WS_GROUP|WS_TABSTOP|BS_DEFPUSHBUTTON,186,54,65,14
  CONTROL "Отмена",IDCANCEL,"Button",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP,186,159,65,14
  CONTROL "Шифрование",ID_CPT,"Button",WS_CHILDWINDOW|WS_VISIBLE|BS_GROUPBOX,0,0,255,87
  CONTROL "",ID_XPOS2,"Edit",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP,132,105,36,12,WS_EX_CLIENTEDGE
  CONTROL "",ID_SPEED2,"Edit",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP,132,123,111,12,WS_EX_CLIENTEDGE
  CONTROL "Дешифрованная строка: ",IDC_STC1,"Static",WS_CHILDWINDOW|WS_VISIBLE,33,123,96,15
  CONTROL "Ключ для дешифрования: ",IDC_STC2,"Static",WS_CHILDWINDOW|WS_VISIBLE,33,105,90,12
  CONTROL "OK",IDOK2,"Button",WS_CHILDWINDOW|WS_VISIBLE|WS_GROUP|WS_TABSTOP|BS_DEFPUSHBUTTON,186,141,65,14
  CONTROL "Дешифрование",ID_CPT2,"Button",WS_CHILDWINDOW|WS_VISIBLE|BS_GROUPBOX,0,81,255,108
END
Помогите, пожалуйста
RAZOR1703 вне форума Ответить с цитированием
Старый 19.12.2010, 18:16   #2
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

А всё просто.
1. В файле ресурсов в описании диалогового окошка добавляете такую строку
Код:
MENU MyMenu ; MyMenu-идентификатор вашего меню.
2. Здесь же в файле ресурсов описываете своё меню, например так:
Код:
MyMenu MENU
   {
     POPUP "&ФАЙЛ"
      {       
	MENUITEM SEPARATOR
        MENUITEM "&Выход", IDM_EXIT
      }
     POPUP "&Настройки"
      {       
        POPUP "&Скин"
        {        
	  	MENUITEM "&Вариант1", IDM_SKIN1
        	MENUITEM SEPARATOR
		MENUITEM "&Вариант2", IDM_SKIN2
		MENUITEM SEPARATOR
		MENUITEM "&Вариант3", IDM_SKIN3
        }
      }	 
     MENUITEM "&Инфо", IDM_ABOUT
   }
Ну вобщем и всё, в головной модуль пишем обработчики, попутно радуемся жизни
В аттаче ваш пример с приклеенным моим меню. Меню мёртвое, ибо разбираться в стиле if-else желания нет.
Вложения
Тип файла: rar proga46.rar (3.7 Кб, 15 просмотров)
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 19.12.2010, 21:15   #3
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию

Спасибо, помогло. Но не на долго
Т.к. нужно было привинчивать еще иконку в трей, .bmp-файл и иконку самой программы, решил использовать CreateDialogParam вместо DialogBoxParam, так как все примеры обычно на CreateWindowEx. А CreateDialogParam ближе всего по структуре.
Но ничего, запилил меню и там. А вот с треем проблема. При двойном клике на нем программа мигает и закрывается
Снова прошу помощи у Вас
Вложения
Тип файла: rar dial.rar (3.3 Кб, 17 просмотров)
RAZOR1703 вне форума Ответить с цитированием
Старый 19.12.2010, 23:11   #4
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

У меня встречный вопрос. Можете объяснить что делает эта конструкция?

Код:
	.ELSEIF uMsg==WM_COMMAND
		mov eax,wParam
		.IF lParam==0
			invoke Shell_NotifyIcon,NIM_DELETE,addr note
			mov eax,wParam
			.if ax==IDM_RESTORE
				invoke ShowWindow,hWnd,SW_RESTORE
			.else
				invoke DestroyWindow,hWnd
			.endif
			.IF ax==IDM_ABOUT
				invoke MessageBox,NULL,ADDR About,ADDR str1,MB_OK
			.ELSEIF ax==IDM_INFO
				invoke MessageBox,NULL,ADDR Info,ADDR str2,MB_OK
			.ELSE
				invoke DestroyWindow,hWnd
			.ENDIF
		.ELSE
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 19.12.2010, 23:28   #5
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию

С трудом, на самом деле, т.к. переделывал пример:D
Вот этот кусок идет из примера с треем. Я его просто скопировал, т.к. большего не требовалось.
Код:
invoke Shell_NotifyIcon,NIM_DELETE,addr note
			mov eax,wParam
			.if ax==IDM_RESTORE
				invoke ShowWindow,hWnd,SW_RESTORE
			.else
				invoke DestroyWindow,hWnd
			.endif
Вот это - обработка пунктов меню.
Код:
.IF ax==IDM_ABOUT
				invoke MessageBox,NULL,ADDR About,ADDR str1,MB_OK
			.ELSEIF ax==IDM_INFO
				invoke MessageBox,NULL,ADDR Info,ADDR str2,MB_OK
			.ELSE
				invoke DestroyWindow,hWnd
			.ENDIF
---UPD---

И, похоже, проблема не только в этом. При нажатии на Справку и выборе одного из пунктов, программа закрывается Все новые и новые сюрпризы.

Последний раз редактировалось RAZOR1703; 20.12.2010 в 00:11.
RAZOR1703 вне форума Ответить с цитированием
Старый 20.12.2010, 00:22   #6
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Цитата:
Все новые и новые сюрпризы.
Да какие новые то? Всё те же.
Цитата:
Я его просто скопировал
Т.е. пример скопировал, а подумать не скопировал, прескорбно.
Давай тогда вместе думать.

Код:
.if ax==IDM_RESTORE
 invoke ShowWindow,hWnd,SW_RESTORE
.else
 invoke DestroyWindow,hWnd
.endif
Это что, если пользователь нажал IDM_RESTORE, то ShowWindow, а если какой то другой пункт, то что DestroyWindow? Так что-ли?
Ах да, а если пользователь нажал всё таки IDM_RESTORE, то второй if-else программу всё-таки добьёт, так?
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 20.12.2010, 15:55   #7
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию

Ulex

С этим разобрался. Просто убрал .else и все.
Но при нажатии Restore в контекстном меню окно мигает и закрывается. То же самое при двойном нажатии на иконке.

EDIT

Все, вроде все кончено. Разобрался. Спасибо, тов. Ulex

Последний раз редактировалось RAZOR1703; 20.12.2010 в 16:19.
RAZOR1703 вне форума Ответить с цитированием
Старый 25.12.2010, 19:14   #8
ya_gonshik
Новичок
Джуниор
 
Регистрация: 20.12.2010
Сообщений: 1
По умолчанию Приделываю меню к диалоговому окну Как

как сделать, чтоб меню реализованной в модуле exMenu было всегда раскрытое, а на так чтоб при наведении на пункт меню открывался список подменю.
http://www.soctrade.com/info/sections/microbio/termostat/index.shtml
ya_gonshik вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как послать message окну Johnson Общие вопросы Delphi 4 09.11.2009 15:18
И сново sendMessage =) Как нажать пункт верхнего меню и меню правой кнопки? TwiX Win Api 9 15.10.2009 01:57
Как обратиться к текстовому окну caveman Общие вопросы Delphi 0 27.09.2009 14:35
Меню с Items в виде набора Bitmap (как меню редактирования в Word'е) chandrasecar Мультимедиа в Delphi 7 14.01.2009 09:20
Добавление меню к окну приложения... MaTBeu Win Api 2 24.09.2008 20:23