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

楼主: w0005151 (蓝厅)   2016-03-03 23:58:15
平台:Visual Studio 2010
小弟最近在学视窗程式的编写
想说先从最底层的Win32 API开始,应该能比较了解整个视窗的运作
但...找了一下坊间讲到C++视窗程式的书大多都是讲MFC
对于Win32 API都只有几页带过,教你怎么创个空的视窗就没了
有研究一下那些在讲MFC的书,觉得那对小弟而言实在太难了
而且版上大大好像也不推荐
所以我打算把Win32 API的一些基础跟流程摸熟之后转至Qt
Qt对我而言应该是比较好上手
以下是小弟的问题
我现在在主视窗中开了两个EDIT WINDOW跟一个BUTTON
想要作一些简单的功能
程式码部分:
先宣告了全域变量
HWND B1,B2,text1; //存子视窗的handle
TCHAR ch1[100]=" "; //之后要用的字串
在WinMain函式里面把BUTTON跟EDIT视窗的handle存进去
B1 = CreateWindow(
_T("BUTTON"),
_T("按钮1"),
WS_CHILD|WS_VISIBLE|WS_BORDER,
10, 10, 50, 20,
hWnd, NULL, hInstance, NULL);
text1 = CreateWindow(
_T("EDIT"),
NULL,
WS_CHILD|WS_VISIBLE|WS_BORDER,
80, 10, 100, 20,
hWnd, NULL, hInstance, NULL);
text2 = CreateWindow(
_T("EDIT"),
NULL,
WS_CHILD|WS_VISIBLE|WS_BORDER,
80, 40, 100, 20,
hWnd, NULL, hInstance, NULL);
SendMessage(text2,ES_READONLY,0,0);
然后在WndProc函式里
case WM_COMMAND:
{if (HWND(lParam) == B1)
{
SendMessage(text2,EM_UNDO,0,0);
SendMessage(text1,EM_GETLINE,0,(LPARAM)ch1);
K=int(ch1[0]);
K-=48;//0在unicode是48
K*=2;//数字乘2
K+=48;//数字变回对应的unicode码
ch1[0]=TCHAR(K);
SendMessage(text2,EM_REPLACESEL,1,(LPARAM)ch1);
InvalidateRect(hWnd,NULL,TRUE);
}
return 0;}
上面的功能就是要让使用者在第一个EDIT输入数字
按按钮后就会让该数字乘以2后显示在第二个EDIT
但是...上面的做法没有考虑输入或输出超过两位的情况,而且也不能处理浮点数
虽然硬要做还是可以(用个循环检查有没有小数点之类的)
想请问如果要做这种接受数字型态input的视窗程式有没有更好的作法?
另外再请问一下用CreateWindow做出来的BUTTON有没有办法帮他定义识别码ID?
还是只能用全域变量纪录他的handler?
还有WndProc接收的HWND型态的引数hWnd是哪一个视窗的handler?
就我所了解程式呼叫WndProc的时机是讯息循环从讯息伫列抓到讯息
然后呼叫DisPatch函式后进入
但是他好像也不是目前送出讯息的视窗的handler
因为if条件那边如果改成 if(hWnd == B1)的话
按按钮就没有反应了
那这个hWnd到底是谁勒??
另外处理不同的讯息只用这种 if switch case的写法吗
这样如果程式规模越来越大感觉会很难维护
感谢大大解答,刚开始学习视窗程式实在有好多疑问
楼主: w0005151 (蓝厅)   2016-03-04 00:02:00
抱歉 这个才对http://imgur.com/UWUUfyi
作者: stupid0319 (征女友)   2016-03-04 23:31:00
visual studio 能直接拖拉元件,很方便了

Links booklink

Contact Us: admin [ a t ] ucptt.com