用win32做一个的计算器的显示问题???

g975291783 2013-08-26 02:37:37
我想用话框做为主窗口做一个计算器,用textedit作为显示算式和输出结果的地方,但是用什么API函数怎么样做才能当鼠标按下‘1’那个按钮或者按下小键盘的‘1’键时,textedit中显示‘1’?
...全文
440 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
g975291783 2013-08-29
  • 打赏
  • 举报
回复
好像是不可以向textedit中发送字符并显示,我用几个WS_BORDER风格的static类,来进行数字的显示,多谢大家的帮助。
zara 2013-08-28
  • 打赏
  • 举报
回复
引用
我用的MASNPLUS,这里没有错误提示啊。
我是直接用的 ml 编译的;你的 MasmPlus 或许是由于 Warning 而非 Error 你没有在意吧。尽管这样,自己也还是要意识到这个规定的,否则预定义的数据就无效了。
g975291783 2013-08-28
  • 打赏
  • 举报
回复
引用 13 楼 wangdahu888 的回复:
怎么没有看到RegisterHotKey
registerhotkey是干什么用的啊
g975291783 2013-08-28
  • 打赏
  • 举报
回复
引用 12 楼 zara 的回复:
编译时不看错误提示啊: .asm(29) : warning A4014: instructions and initialized data not supported in BSS segments 看看那行,带预定义数据的不能定义在 .data? 段里,应该是在 .data 段:
.data
  hInstance dd ?
  sz_1	db '1', 0
我用的MASNPLUS,这里没有错误提示啊。
  • 打赏
  • 举报
回复
怎么没有看到RegisterHotKey
zara 2013-08-28
  • 打赏
  • 举报
回复
编译时不看错误提示啊:
.asm(29) : warning A4014: instructions and initialized data not supported in BSS segments
看看那行,带预定义数据的不能定义在 .data? 段里,应该是在 .data 段:
.data
hInstance dd ?
sz_1 db '1', 0
zara 2013-08-27
  • 打赏
  • 举报
回复
所以在 WM_COMMAND 上下断点,看看是不是可以停下来,若是可以,看这是 eax 和 VK_NUMPAD1 间究竟差以何在;若也是断不下来,就有些麻烦了,用 VC 里的 Spy++ 来查看下消息流是个方法,或者把完整代码发上来吧
g975291783 2013-08-27
  • 打赏
  • 举报
回复
我在第九行上下了断点,然后点击按钮1,程序没有中断,说明这句“.elseif eax==VK_NUMPAD1”没有执行啊,这是怎么回事儿啊?而且当点击退出按钮时可以成功执行第6,7行。
zara 2013-08-27
  • 打赏
  • 举报
回复
第9行上断点,断下来了没有?如果没有,那就在 mov eax, wParam 上断点;如果断下来了,后面几个调用执行结果如何?
g975291783 2013-08-27
  • 打赏
  • 举报
回复

	.elseif uMsg==WM_COMMAND
		mov eax,wParam
		and eax,0ffffh
		.if eax==IDOK
			;invoke SendMessage,hWnd,WM_CLOSE,TRUE,0
		.elseif eax==IDCANCEL
			invoke SendMessage,hWnd,WM_CLOSE,0,0
		.elseif eax==VK_NUMPAD1
			;这里该怎么写
			invoke SetDlgItemText,hDlgItem,3,"1"
			invoke UpdateWindow,hWnd
		.endif
我在第9行设置了断点,运行程序后点‘1’按钮还是没有反应,是不是说‘eax==VK_NUMPAD1’这里写的不对啊?
zara 2013-08-27
  • 打赏
  • 举报
回复
调试软件里在此处断点,按下那个按钮,看执行什么状况了。通常,这个应该是 WM_COMMAND 下的吧,eax 是 LOWORD(wParam) ?
g975291783 2013-08-27
  • 打赏
  • 举报
回复
我把代码改成了这样但是为什么还是不行啊?

;MASMPlus 代码模板 - 以对话框做为主窗口的程序

.386
.Model Flat, StdCall
Option Casemap :None

Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc


includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
include macro.asm
	
	DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
	
.const
	DLG_MAIN equ 100
	IDC_RTEXT EQU		101
	
.data?
	hInstance dd ?
	sz_1	db		'1',0
.CODE
START:
	invoke GetModuleHandle,NULL
	mov hInstance,eax
	invoke DialogBoxParam,hInstance,DLG_MAIN,0,offset DlgProc,0
	invoke ExitProcess,0

DlgProc proc hWnd,uMsg,wParam,lParam
	.if uMsg==WM_INITDIALOG
		invoke LoadIcon,hInstance,100
		invoke SendMessage,hWnd,WM_SETICON,ICON_SMALL,eax
		invoke SendDlgItemMessage,hWnd,3,EM_SETREADONLY,TRUE,NULL
		invoke GetDlgItem,hWnd,IDC_RTEXT
		;mov hDlgItem,eax
	.elseif uMsg==WM_COMMAND
		mov eax,wParam
		and eax,0ffffh
		.if eax==IDOK
			;invoke SendMessage,hWnd,WM_CLOSE,TRUE,0
		.elseif eax==IDCANCEL
			invoke SendMessage,hWnd,WM_CLOSE,0,0
		.elseif eax==VK_NUMPAD1
			;这里该怎么写
			invoke SetDlgItemText,hWnd,3,addr sz_1
			;invoke UpdateWindow,hWnd
		.endif
	.elseif uMsg==WM_CLOSE
		invoke EndDialog,hWnd,wParam
	.else
		mov eax,FALSE
		ret
	.endif
	mov eax,TRUE
	ret
DlgProc endp

END START
我多加了这句‘invoke SendDlgItemMessage,hWnd,3,EM_SETREADONLY,TRUE,NULL’将文本框改成了只读的。
zara 2013-08-27
  • 打赏
  • 举报
回复
VK_NUMPAD1 这里,怎么会没有断下来呢?但后续的 hDlgItem 的使用上是错误的,因为它是子程内的局部变量定义,不同消息进入时,是不被保留的,所以,如果要使用它,应该定义在 .data 或 .data? 段力,或者是直接使用 hWnd 参数;另外,"1" 的使用也是错误的,应该独立出去定义为一个字符串,然后将该字符串地址作为参数给 SetDlgItemText() 函数使用,你现在的写法,是将字符的 ascii 作为字符串地址了,所以会出访问错误而致程序崩溃的。
g975291783 2013-08-27
  • 打赏
  • 举报
回复
这是我的代码

;MASMPlus 代码模板 - 以对话框做为主窗口的程序

.386
.Model Flat, StdCall
Option Casemap :None

Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc


includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
include macro.asm
	
	DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
	
.const
	DLG_MAIN equ 100
	IDC_RTEXT EQU		101
	
.data?
	hInstance dd ?
.CODE
START:
	invoke GetModuleHandle,NULL
	mov hInstance,eax
	invoke DialogBoxParam,hInstance,DLG_MAIN,0,offset DlgProc,0
	invoke ExitProcess,0

DlgProc proc hWnd,uMsg,wParam,lParam
		local 	 hDlgItem
	.if uMsg==WM_INITDIALOG
		invoke LoadIcon,hInstance,100
		invoke SendMessage,hWnd,WM_SETICON,ICON_SMALL,eax
		invoke GetDlgItem,hWnd,IDC_RTEXT
		mov hDlgItem,eax
	.elseif uMsg==WM_COMMAND
		mov eax,wParam
		and eax,0ffffh
		.if eax==IDOK
			;invoke SendMessage,hWnd,WM_CLOSE,TRUE,0
		.elseif eax==IDCANCEL
			invoke SendMessage,hWnd,WM_CLOSE,0,0
		.elseif eax==VK_NUMPAD1
			;这里该怎么写
			invoke SetDlgItemText,hDlgItem,3,"1"
			invoke UpdateWindow,hWnd
		.endif
	.elseif uMsg==WM_CLOSE
		invoke EndDialog,hWnd,wParam
	.else
		mov eax,FALSE
		ret
	.endif
	mov eax,TRUE
	ret
DlgProc endp

END START
这是资源文件

#include		<resource.h>
#define ICO_MAIN		0x1000
#define DLG_MAIN		100
DLG_MAIN DIALOG 10,10,230,150
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 
CAPTION "我的计算器"
{
control 	"",3,"Edit", ES_RIGHT + WS_BORDER  ,10,10,210,30
DEFPUSHBUTTON "1",VK_NUMPAD1,10,60,35,14
DEFPUSHBUTTON "2",VK_NUMPAD2,50,60,35,14
DEFPUSHBUTTON "3",VK_NUMPAD3,90,60,35,14
DEFPUSHBUTTON "4",VK_NUMPAD4,10,75,35,14
DEFPUSHBUTTON "5",VK_NUMPAD5,50,75,35,14
DEFPUSHBUTTON "6",VK_NUMPAD6,90,75,35,14
DEFPUSHBUTTON "7",VK_NUMPAD7,10,90,35,14
DEFPUSHBUTTON "8",VK_NUMPAD8,50,90,35,14
DEFPUSHBUTTON "9",VK_NUMPAD9,90,90,35,14
DEFPUSHBUTTON "0",VK_NUMPAD0,10,105,75,14
DEFPUSHBUTTON "+",VK_ADD,130,60,35,14
DEFPUSHBUTTON "-",VK_SUBTRACT,170,60,35,14
DEFPUSHBUTTON "*",VK_MULTIPLY,130,75,35,14
DEFPUSHBUTTON "/",VK_DIVIDE,170,75,35,14
DEFPUSHBUTTON ".",VK_DECIMAL,90,105,35,14
DEFPUSHBUTTON "=",IDOK,130,105,75,14
PUSHBUTTON "EXIT",IDCANCEL,130,125,50,14
}
第6,7行可以成功执行说明“.elseif uMsg==WM_COMMAND”这句没问题,问题就应该是出在“.elseif eax==VK_NUMPAD1”这里。
g975291783 2013-08-26
  • 打赏
  • 举报
回复
我资源文件时这么定义的,

#include <resource.h>
#define ICO_MAIN 0x1000
#define DLG_MAIN 100
DLG_MAIN DIALOG 10,10,230,150
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "我的计算器"
{
control "",3,"Edit", ES_RIGHT + WS_BORDER ,10,10,210,30
DEFPUSHBUTTON "1",VK_NUMPAD1,10,60,35,14
DEFPUSHBUTTON "2",VK_NUMPAD2,50,60,35,14
DEFPUSHBUTTON "3",VK_NUMPAD3,90,60,35,14
DEFPUSHBUTTON "4",VK_NUMPAD4,10,75,35,14
DEFPUSHBUTTON "5",VK_NUMPAD5,50,75,35,14
DEFPUSHBUTTON "6",VK_NUMPAD6,90,75,35,14
DEFPUSHBUTTON "7",VK_NUMPAD7,10,90,35,14
DEFPUSHBUTTON "8",VK_NUMPAD8,50,90,35,14
DEFPUSHBUTTON "9",VK_NUMPAD9,90,90,35,14
DEFPUSHBUTTON "0",VK_NUMPAD0,10,105,75,14
DEFPUSHBUTTON "+",VK_ADD,130,60,35,14
DEFPUSHBUTTON "-",VK_SUBTRACT,170,60,35,14
DEFPUSHBUTTON "*",VK_MULTIPLY,130,75,35,14
DEFPUSHBUTTON "/",VK_DIVIDE,170,75,35,14
DEFPUSHBUTTON ".",VK_DECIMAL,90,105,35,14
DEFPUSHBUTTON "=",IDOK,130,105,75,14
PUSHBUTTON "EXIT",IDCANCEL,130,125,50,14
}

下面是点击1那个按钮的代码,

.elseif eax==VK_NUMPAD1
;这里该怎么写
invoke SetDlgItemText,hDlgItem,3,"1"
invoke UpdateWindow,hWnd

这个是程序的界面
但是为什么点‘1’那个按钮没反应呢?
g975291783 2013-08-26
  • 打赏
  • 举报
回复
对话框的句柄和控件的id怎么获得啊?
赵4老师 2013-08-26
  • 打赏
  • 举报
回复
SetDlgItemText The SetDlgItemText function sets the title or text of a control in a dialog box. BOOL SetDlgItemText( HWND hDlg, // handle of dialog box int nIDDlgItem, // identifier of control LPCTSTR lpString // text to set ); Parameters hDlg Identifies the dialog box that contains the control. nIDDlgItem Identifies the control with a title or text that is to be set. lpString Pointer to the null-terminated string that contains the text to be copied to the control. Return Values If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError. Remarks The SetDlgItemText function sends a WM_SETTEXT message to the specified control. QuickInfo Windows NT: Requires version 3.1 or later. Windows: Requires Windows 95 or later. Windows CE: Requires version 1.0 or later. Header: Declared in winuser.h. Import Library: Use user32.lib. Unicode: Implemented as Unicode and ANSI versions on Windows NT. See Also Dialog Boxes Overview, Dialog Box Functions, GetDlgItemInt, GetDlgItemText, SetDlgItemInt, WM_SETTEXT
课程设计报告 题目:在win32 application工程下计算 陈李元 41212204 余 斌 41212202 概述 课程设计的内容 系统需求分析 系统目标 重要功能 开发环境 设计过程 主函数WinMain设计过程 窗口过程WndProc 小结 参考文献 1:程序代码 2:程序运行部分截图 概述 课程设计的内容 c++课程设计我们组选的是设计一个带界面的计算 MFC,而是在win32 application工程下的带界 windows程序设计范畴。 系统需求分析 系统目标 另外还具有计算N阶阶乘的功能,此外还具 。 重要功能 开发环境 visual c++ 6.0编译,链接,运行。它是在 工程下所创建。 设计过程 主函数WinMain设计过程 windows API。这 windows.h标准库中。 windows程序设计中,它必须要包含一个程序入口主 WinMain和一个过程函数WndProc。 总是以下面的形式出现。 WINAPI WinMain (HINSTANCE hInstance, WinMain第一个参数一般叫“实例句柄”,在windows 第二个参数总是定义为NULL(定义为0) 第三个参数是用来运行程序的命令行。有些windows程 第四个参数用来指明程序最初如何显示。 1)注册窗口类 2)创建窗口 3)在桌面显示窗口 4)更新窗口客户区 5)进入无限的消息获取和处理的循环。首先是获取 WM_QUIT,则GetMessage函数返回FALSE,整 WndProc 注册: 程序设计中有许许多多的结构体。其中 是用于注册窗口类的。 窗口类型 窗口处理函数 窗口扩展 窗口实例扩展 实例句柄 窗口的最小化图标 窗口鼠标光标 窗口背景色 窗口菜单 窗口类名 : 创建窗口 CreateWindow函数 指向已注册窗口类名称的指针

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧