词条 | SetBkMode |
释义 | 基本概述原型:一是MFC里面封装的CDC类: CDC::SetBkMode int SetBkMode( int nBkMode ); API函数SetBkMode声明如下: int SetBkMode( HDC hdc, // handle of device context int iBkMode // flag specifying background mode ); 参数:hDC是当前设备的句柄。 mode是要设置的模式,其值可以为OPAQUE和TRANSPARENT。 输出的字符串时,发现存在背景色,这样的输出是破坏背景的。那需要使用什么方法来保持背景不变,而又能输出红色的字符串呢?比如按钮的文字颜色是黑色的,而背景是灰色的。这就需要使用SetBkMode函数来设置DrawText函数的输出方式,显示设备共有两种输出方式:OPAQUE和TRANSPARENT。OPAQUE的方式是用当前背景的画刷的颜色输出显示文字的背景,而TRANSPARENT是使用透明的输出,也就是文字的背景是不改变的。 对透明的理解:在窗体或控件输出的字符串或图形是有背景色的。而窗体或控件也是有背景色的。这两种背景色一般是不同的, 这样输出图形或字符串时,两种背景(窗体或控件的背景色、符串或图形的背景色)重叠在一起了,影响美观,为了不让这两种背景重叠,可以设置背景模式为TRANSPARENT(透明的),即让输出的字符串或图形的背景色不可见。可以这样理解:把输出的字符串或图形的背景色看成是一物体,窗体或控件看成另一物体,字符串或图形在窗体或控件前面挡住窗体或控件了(因为输出 的字符串或图形是画在窗体或控件上的,所以可以这么类比),但是透过字符串或图形能看到窗体或控件。即字符串或图形的背 景色所代表的物体是透明的。 SetBkMode与SetBkColor理解以前总不是太明白这几者之间的关系:SetBkMode, SetBkColor, wndclass.hbrBackground, 说实在的, 还是拿程序说话, 写个程序就能明白了…… 我们以前一次的一个程序来说明: /* 画笔练习程序, by netrookie, ChinaUnix. * 请参考《windows程序设计》第五章:图形基础,画笔部分 * 此程序通过一个switch结构, 告诉我们怎样创建画笔和删除画笔。 */ #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCEhInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("MyPen"); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = GetStockObject(GRAY_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if(!RegisterClass(&wndclass)) { MessageBox(NULL, TEXT("Register failure..."), szAppName, MB_ICONERROR); return 0; } hwnd = CreateWindow(szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while(GetMessage(&msg, NULL, 0, 0)) { DispatchMessage(&msg); TranslateMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static int cxClient, cyClient, i; HDC hdc; PAINTSTRUCT ps; HPEN hPen; LOGPEN logPen; switch(message) { case WM_SIZE: cxClient = LOWORD(lParam); cyClient = HIWORD(lParam); i = 0; return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); SetBkColor(hdc, RGB(0, 255, 255)); // 注释运行和不注释它运行 // SetBkMode(hdc, TRANSPARENT); switch(i) { case 0: hPen = CreatePen(PS_SOLID, 2, RGB(10, 10, 10)); break; case 1: hPen = CreatePen(PS_DASH, 1, RGB(20, 20, 20)); break; case 2: hPen = CreatePen(PS_DOT, 1, RGB(255, 30, 30)); break; case 3: hPen = CreatePen(PS_DASHDOT, 1, RGB(40, 40, 40)); break; case 4: hPen = CreatePen(PS_DASHDOTDOT, 1, RGB(50, 50, 50)); break; case 5: logPen.lopnStyle = PS_SOLID; logPen.lopnColor = RGB(0, 60, 60); /* * 此处是非常有意思的,下面有说明 */ logPen.lopnWidth.x = 5; hPen = CreatePenIndirect(&logPen); break; default: hPen = GetStockObject(BLACK_PEN); break; } SelectObject(hdc, hPen); MoveToEx(hdc, 0, (i + 1) * cyClient / 10, NULL); LineTo(hdc, cxClient, (i + 1) * cyClient / 10); TextOut(hdc, i* cxClient / 7, 4 * cyClient / 5, "windows", lstrlen("windows")); if(i++ <= 5) InvalidateRect(hwnd, NULL, FALSE); EndPaint(hwnd, &ps); // 删除GDI对象, 释放内存!! DeleteObject(hPen); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } 一运行终于明白了 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。