请输入您要查询的百科知识:

 

词条 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条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2024/12/23 19:04:33