Re: [问题] C++ Win32 API EDIT Window的问题

楼主: icetofux   2016-03-04 09:36:19
※ 引述《w0005151 (蓝厅)》之铭言:
: 平台:Visual Studio 2010
: 小弟最近在学视窗程式的编写
: 想说先从最底层的Win32 API开始,应该能比较了解整个视窗的运作
: 但...找了一下坊间讲到C++视窗程式的书大多都是讲MFC
: 对于Win32 API都只有几页带过,教你怎么创个空的视窗就没了
: 有研究一下那些在讲MFC的书,觉得那对小弟而言实在太难了
: 而且版上大大好像也不推荐
: 所以我打算把Win32 API的一些基础跟流程摸熟之后转至Qt
: Qt对我而言应该是比较好上手
除非很有兴趣或是有特殊需求, 不然直接学 QT 应该会较快, 我记得 QT 用起来跟用
API 刻视窗风格上完全不同. 如果最终目的是 QT, 先学会这个帮助应该不大.
: 但是...上面的做法没有考虑输入或输出超过两位的情况,而且也不能处理浮点数
: 虽然硬要做还是可以(用个循环检查有没有小数点之类的)
: 想请问如果要做这种接受数字型态input的视窗程式有没有更好的作法?
在 CreateWindow 的 dwStyle 参数里加入 ES_NUMBER 应该就只能输入数字
但不确定浮点数能不能
: 另外再请问一下用CreateWindow做出来的BUTTON有没有办法帮他定义识别码ID?
: 还是只能用全域变量纪录他的handler?
我记得可以在 CreateWindow 的 hMenu 参数定义一个识别码, 在 WndProc 里检测
事件时比对识别码来看是谁触发的, 可是后来我还是习惯比 hwnd, 因为
1. 还是得用全域变量或其他方法记录这个识别码.
2. 讯息循环里的比较步骤并没有比较简单.
: 还有WndProc接收的HWND型态的引数hWnd是哪一个视窗的handler?
: 就我所了解程式呼叫WndProc的时机是讯息循环从讯息伫列抓到讯息
: 然后呼叫DisPatch函式后进入
: 但是他好像也不是目前送出讯息的视窗的handler
: 因为if条件那边如果改成 if(hWnd == B1)的话
: 按按钮就没有反应了
: 那这个hWnd到底是谁勒??
应该是这个讯息循环主视窗的 handle.
: 另外处理不同的讯息只用这种 if switch case的写法吗
: 这样如果程式规模越来越大感觉会很难维护
我有试过把各种元件包成一个类别, 然后统一用一个 vector 来储存视窗上每个元件
的 hwnd, 当事件触发时只要用检查有该事件的元件哪个符合即可.
比方说发生 BN_CLICKED 只要去检查 lpClassName 是 BUTTON 的元件即可.
本质上它还是一堆 if/switch 判断式, 但因为加上 vector 可以用迭代的方式去比对
, 程式码看起来会干净很多.
: 感谢大大解答,刚开始学习视窗程式实在有好多疑问
我对这方面也很有兴趣, 但不得不说资料真的不好找, 目前最主要的资料来源还是 MSDN,
其他有些网站虽然对于 API 有更白话的说明, 不过不是 C/C++ 语言的.
以上都是凭印象回答, 如果有误就抱歉啦.
作者: w0005151 (蓝厅)   2016-03-04 17:34:00
感谢回答,EDIT加上ES_NUMBER好像只是限制使用者的输入只能是数字,但还是要靠自己把他从char转成int@@
楼主: icetofux   2016-03-04 19:38:00
这很容易 用sstream可以把字串转成int或float

Links booklink

Contact Us: admin [ a t ] ucptt.com