win32对话框怎样改变eidt控件颜色,以及怎样捕获键盘消息

在上篇文章《建立win32对话框程序向导》讲了怎样建立一个生成win32对话框程序的工程向导。

但是我在写 “笨兔数独”的时候发现我无法使用SetBkColor等函数改变edit控件的背景颜色和文本颜色,以及我无法捕捉键盘消息。每次对着对话框的空白处按键只会听到一个 “嘟”的声音。

后来在互联网的“帮助”下,配合一本《windows程序设计》终于解决了这两个问题。现在将解决的方法分享给大家。

1>怎样改变edit控件的文本颜色以及背景颜色

刚开始我自己的解决方法是使用GetDC获取edit控件的hdc,然后使用这个hdc设置背景颜色和文本颜色。但是实践告诉,这个方法并不起作用。

怎么办呢?上网搜索吧。在网上搜索“edit控件 文本颜色”等关键字,确实搜索不少这方面的内容。但是我打开一看,发现里面很多都是MFC的程序。开始不愿使用MFC,因为不会。后来没办法将MFC的程序搭建了起来。发现果然有效。但是后来因为想到如果要将程序转到MFC,我不知道会遇到多少问题(win32和MFC中同名函数的参数不同,牵扯到类什么的,我晕)。而且自己心里也想直接在win32中解决这个问题。“我就不信我解决不了”,我对自己这样说。

后来,终于被我找到了方法。在网上,在《windows程序设计》中,在MFC的例子程序中,找到了一个 WM_CTLCOLOR消息。继而找到了WM_CTLCOLOREDIT消息。在edit控件被绘制的时候会给它的父窗口发送WM_CTLCOLOREDIT消息。其中wParam参数保存了edit的hdc。可以利用这个hdc设置文本的背景颜色和文字颜色。代码像下面这样:

case WM_CTLCOLOREDIT:{HDC hdc = (HDC)wParam;HBRUSH hbrush;/* 创建画刷 */hbrush = CreateSolidBrush(RGB(0,0,255));SetBkColor(hdc,RGB(0,255,0));SetTextColor(hdc,RGB(255,0,0));/*** 处理WM_CTLCOLOREDIT消息必须返回一个画刷** windows使用这个画刷绘制edit控件的背景** 注意这个背景和文字背景颜色不同*/return (LRESULT)hbrush;}break;

程序运行截图:为什么edit控件有两种颜色?

这里需要注意的是*处理WM_CTLCOLOREDIT消息必须返回一个画刷。windows使用这个画刷绘制edit控件的背景。注意这个背景和文字背景颜色不同。文字的背景颜色如果和返回的画刷颜色不一样,那么文字背景颜色会覆盖edit中第一行输入,因为我们设置了文本的背景颜色。那么怎么解决这个问题呢?

很简单,将返回给系统的画刷设置成和文字背景一样的颜色就可以了。上面的代码你可以将

SetBkColor(hdc,RGB(0,255,0));

改成SetBkColor(hdc,RGB(0,0,255));

那么程序的运行结果就成了下面这样:问题解决!:)如果你有其他的一些问题,欢迎和我交流。

2>win32对话框捕获键盘消息我建立的这个对话框还有一个问题,就是无法捕获键盘消息。我在对话框过程中加入case WM_KEYDOWN尝试捕获键盘消息,但是很遗憾,It doesn’t work!

后来在《windows程序设计》中了解到,对话框收不到WM_KEYDOWN等键盘消息。因为windows系统内部的消息处理过程不会给对话框过程发送这类消息。一时不知道该怎么办。最后思来想去,加上在网上的搜索。我在WinMain函数中加入了window窗口程序的消息处理代码。

//捕获WM_KEYDOWN消息while (GetMessage(&msg, NULL, 0, 0))    {        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))        {             if (IsWindow(hDlg)&&(IsDialogMessage(hDlg, &msg)||IsChild(hDlg,msg.hwnd)))             {                 if (msg.message==WM_KEYDOWN)                 {SendMessage(hDlg,msg.message,msg.wParam,msg.lParam);                 }             }            else            {                TranslateMessage(&msg);                DispatchMessage(&msg);            }        }    }

这个代码是从网上搜来的,原先我自己的代码没有判断它是否是WM_KEYDOWN直接发送给对话框过程,结果我的代码还是不能捕获WM_KEYDOWN。后来换成这个代码,我很高兴。It? works!

你可以在对话框过程中加入case WM_KEYDOWN…来处理键盘消息了。不过因为在WinMain中加入了消息循环。而我们又没有显示windows窗口,没有相应的windows窗口过程(虽然我们有对话框过程,但要分清他们是不同的)。所以当我们关闭对话框时,程序还没有结束,一直在消息循环中运行。所以你还必须在你关闭对话框的时候加一句代码:

PostQuitMessage(0);

这样消息循环中的GetMessage会返回0,然后退出循环。WinMain返回,程序结束。

以上就是我解决这两个问题的方法,希望对你有用。同时,如果你发现了文章中的错误和不足,欢迎向我指出。

(全文完)

若非注明,均为原创文章,转载请注明: 转载自大笨兔

本文链接地址: win32对话框怎样改变eidt控件颜色,以及怎样捕获键盘消息

相关文章:

你感兴趣的文章:

标签云: