代码如下:
switch(nCtlColor)
{
case CTLCOLOR_STATIC:
CWnd *pStatic = (CWnd*)GetDlgItem(IDC_STATIC_NAME);
if (pStatic==pWnd)
pDC->SetTextColor(RGB(255, 0, 0)); break;
}问题是:当我在改一个对话框里的静态文本时就可以,而该一个对话框中属性页(用的TabCtrl)里的静态文本就不行,问题出在哪里呢?
switch(nCtlColor)
{
case CTLCOLOR_STATIC:
CWnd *pStatic = (CWnd*)GetDlgItem(IDC_STATIC_NAME);
if (pStatic==pWnd)
pDC->SetTextColor(RGB(255, 0, 0)); break;
}问题是:当我在改一个对话框里的静态文本时就可以,而该一个对话框中属性页(用的TabCtrl)里的静态文本就不行,问题出在哪里呢?
#include <windows.h>
#include <stdlib.h>
#include <string.h>
void WINAPI CaretPos(int *xCaret,int *yCaret);
long WINAPI WndProc(HWND hWnd, UINT iMessage,UINT wParam,LONG lParam);
BOOL InitWindowsClass(HINSTANCE hInstance);
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);
HWND hWndMain;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
MSG Message;
if(!InitWindowsClass(hInstance))
return FALSE;
if(!InitWindows(hInstance,nCmdShow))
return FALSE;
while(GetMessage(&Message,0,0,0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
long WINAPI WndProc(HWND hWnd, UINT iMessage,UINT wParam,LONG lParam)
{
#define BufSize 30
static char cCharBuf[BufSize];
static int nNumChar=0;
static int nArrayPos=0;
static int nLnHeight;
static int nCharWidth;
static int xCaret,yCaret;
int x;
HDC hDC;
TEXTMETRIC tm;
PAINTSTRUCT PtStr;
switch(iMessage)
{
case WM_CHAR:
if(wParam==VK_BACK)
{
if(nArrayPos==0)
MessageBox(hWnd,"当前位置是文本的起始位置,不能回退",NULL,MB_OK);
else
{
nArrayPos=nArrayPos-1;
CaretPos
(&xCaret,&yCaret);
nNumChar=nNumChar-1;
InvalidateRect(hWnd,NULL,TRUE);
}
break;
}
if(wParam==VK_ESCAPE)
{
if(nArrayPos==0)
MessageBox(hWnd,"您现在不能按此键,请继续其他操作",NULL,MB_OK);
break;
if(nNumChar>=BufSize)
{
MessageBox(hWnd,"缓冲区已满不能再输入字符了",NULL,MB_OK);
break;
}
for(x=nNumChar;x>nArrayPos;x=x-1)
cCharBuf[x]=cCharBuf[x-1];
cCharBuf[nArrayPos]=(unsigned char)wParam;
nArrayPos=nArrayPos+1;
nNumChar=nNumChar+1;
CaretPos(&xCaret,&yCaret);
InvalidateRect(hWnd,NULL,TRUE);
break;
case WM_CREATE:
hDC=GetDC(hWnd);
GetTextMetrics(hDC,&tm);
nLnHeight=tm.tmHeight+tm.tmExternalLeading;
nCharWidth=tm.tmAveCharWidth;
yCaret=nLnHeight;
ReleaseDC(hWnd,hDC);
break;
case WM_SETFOCUS:
CreateCaret(hWnd,0,0,nLnHeight);
CaretPos(&xCaret,&yCaret);
ShowCaret(hWnd);
break;
case WM_KILLFOCUS:
DestroyCaret();
break;
case WM_KEYDOWN:
switch(wParam)
{
case VK_END:
nArrayPos=nNumChar;
CaretPos(&xCaret,&yCaret);
break;
case VK_HOME:
nArrayPos=0;
CaretPos(&xCaret,&yCaret);
break;
case VK_DELETE:
if(nArrayPos==nNumChar)
MessageBox(hWnd,"缓冲区已空,没有字符可供删除",NULL,MB_OK);
else
{
for(x=nArrayPos;x<nNumChar;x=x+1)
cCharBuf[x]=cCharBuf[x+1];
nNumChar=nNumChar-1;
InvalidateRect(hWnd,NULL,TRUE);
}
break;
case VK_LEFT:
if(nArrayPos>0)
{
nArrayPos=nArrayPos-1;
CaretPos(&xCaret,&yCaret);
}
else
MessageBox(hWnd,"您已经移动到起始位置了,不能再往左移动了",NULL,MB_OK);
break;
case VK_RIGHT:
if(nArrayPos<nNumChar)
{
nArrayPos=nArrayPos+1;
CaretPos(&xCaret,&yCaret);
}
else
MessageBox(hWnd,"已经到缓冲区的末尾,不能往右移动了",NULL,MB_OK);
break;
}
}
break;
case WM_PAINT: hDC=BeginPaint(hWnd,&PtStr);
TextOut(hDC,nCharWidth,nLnHeight,cCharBuf,nNumChar);
EndPaint(hWnd,&PtStr);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
return 0;
}
void WINAPI CaretPos(int *xCaret,int *yCaret)
{
DWORD dWord;
HDC hDC;
hDC=GetDC(hWnd);
ReleaseDC(hWnd,hDC);
*xCaret=LOWORD(dWord)+nCharWidth;
SetCaretPos(*xCaret,*yCaret);
}
BOOL InitWindowsClass(HINSTANCE hInstance)
{
WNDCLASS WndClass;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,"");
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=WndProc;
WndClass.lpszClassName="WinKeyBoard";
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW|CS_VREDRAW;
return RegisterClass(&WndClass);
}
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow)
{
HWND hWnd;
hWnd=CreateWindow("WinKeyBoard","键盘操作例程",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);
if(!hWnd)
UpdateWindow(hWnd);
return TRUE;
}