当前位置:C++技术网 > 精选软件 > win32使用GetKeyState函数实现Ctrl+A全选文字背景色效果

win32使用GetKeyState函数实现Ctrl+A全选文字背景色效果

更新时间:2016-01-07 17:54:35浏览次数:1+次

    可能编辑框这些控件,我们对于全选文字后文字有背景色效果,熟视无睹了。然而,要如何实现,可能很少人想过这个问题吧。这不是无意义的。在一些个性化的控件,第三方提供的皮肤库,各种控件都是自己封装的。所以,效果和系统提供的完全不一样,美观多了。
    我们这里就是来实现这个效果。你可以定制全选后文字背景色。

    下面是实现的全选文字的效果图:

全选文字的效果图

【全选文字的效果图】
    全选文字后,背景色不是默认的蓝色了。这是我随便指定的一个颜色。当然,选择文字,也是可以应用这个背景色的。全选文字不就是选择文字的一个特例嘛。
    我们这里不仅要说明全选效果,更是同时说明如何实现Ctrl+A来全选。这个组合键实现全选,就是我们的重点。设置背景色其实不难,我们将两者结合起来,实现一个实用的功能。给没有开发经验的同学一个参考。
    设置背景色,调用函数SetBkColor即可,在前面的文章都讲述了。如果你没有看,请在C++技术网的【操作系统】->【Windows】 频道下看相关的文章。
    我们需要做的,就是根据键盘的按键,来决定是否设置背景色。当按下Ctrl+A的组合键时才设置背景色,当只按A键时取消背景色。当然更多方式,你可以自己决定。这里只是一种参考。你可以在鼠标单击时去掉背景色。而要不要设置背景色,我们使用一个布尔变量来保持状态。当变量为true时,就设置背景色,否则不设置背景色。显示背景色的效果,在WM_PAINT消息中执行,代码如下:
if (bIsSelAll)
{
    SetBkColor(hdc,RGB(127,227,100));
}
TextOut(hdc,0,0,txt,lstrlen(txt));
    我们按下Ctrl+A组合键时就设置布尔变量为true,否则设置为false。字母键的虚拟键码为大写字母的ASCII码。所以只要判断wParam为A的ASCII编码即表示按下了A键。然后判断此时是否按下了Ctrl键,就可以判断是否是组合键Ctrl+A。
    要判断Ctrl键是否按下,调用函数GetKeyState,传入Ctrl键的虚拟键码VK_CONTROL得到返回值,如果返回值为负数,即表示按下了Ctrl键。
    确定按了组合键,就设置布尔变量为true,否则设置为false。再让客户区无效,产生重画,就可以显示全选后的效果。
    下面是完整的代码:
#include "windows.h"
#include <tchar.h>
TCHAR txt[100]=_T("C++技术网www.cjjjs.com");
// - 项目是Unicode字符集
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    static bool bIsSelAll=false;
    switch (message)
    {
        case WM_PAINT:
            hdc = BeginPaint(hwnd,&ps);

            if (bIsSelAll)
            {
                SetBkColor(hdc,RGB(127,227,100));
            }
            TextOut(hdc,0,0,txt,lstrlen(txt));

            EndPaint(hwnd,&ps);
            return 0;
        case WM_KEYDOWN:
            {
                if (_T('A')==wParam)//字母键的虚拟键码为大写字母的ASCII码
                {
                    int iState = GetKeyState(VK_CONTROL);
                    if(iState<0)
                    {
                        bIsSelAll=true;
                    }
                    else
                    {
                        bIsSelAll=false;
                    }
                }
                InvalidateRect(hwnd,NULL,TRUE);
                return 0;
            }
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
        break;//跳出到默认处理
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev,LPSTR lpCmd,int iShow)
{
    TCHAR ClassName[] = _T("MyClass");
    TCHAR title1[] = _T("C++技术网http://www.cjjjs.com");
    WNDCLASS wndClass;
    wndClass.cbClsExtra=0;
    wndClass.cbWndExtra=0;
    wndClass.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndClass.hCursor=LoadCursor(NULL,IDC_HAND);
    wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wndClass.hInstance = hInstance;
    wndClass.lpfnWndProc = WinProc;
    wndClass.lpszClassName = ClassName;
    wndClass.lpszMenuName=NULL;
    wndClass.style=CS_HREDRAW|CS_VREDRAW;

    if(!RegisterClass(&wndClass))return 0;
    HWND hwnd = CreateWindow(ClassName,title1,WS_OVERLAPPEDWINDOW,0,0,650,400,NULL,NULL,hInstance,NULL);
    ShowWindow(hwnd,SW_SHOWNORMAL);

    MSG msg;
    while (GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}