在下面的源代码中
(M1) hedit = CreateWindow("edit",... 方法将背景颜色更改为绿色。
(M2) hedit = CreateWindowEx(0, RICHEDIT_CLASS,... 方法不会更改背景颜色。
(M3) hedit = CreateWindowEx(0, MSFTEDIT_CLASS,... 方法,编译结果出现下面的警告信息。 [警告] 从不兼容的指针类型传递“CreateWindowExA”的参数 2
(问题1)使用M2方法时如何更改背景颜色?
(问题2)如何在M3方法中编译好?
(问题 3)通过将 BRICHED 指定为 #define if(BRICHED == 2){ hedit = CreateWindowEx(0, RICHEDIT_CLASS, ...,编译无法正常工作。 消息:“[警告]从不兼容的指针类型传递“CreateWindowExA”的参数 2”。 这是#define 无法处理的事情吗?
#include <stdio.h>
#include <windows.h>
#include <richedit.h>
//#define BRICHED 2 // 0:no richedit / 2:richedit2.0 / 4:richedit4.1
#define D_POP(_S) { MessageBox(g_hwnd, (_S), "Message", MB_OK); }
HINSTANCE g_hInst;
HWND g_hwnd, hedit;
WNDPROC OldEditProc;
//HINSTANCE hInstance;
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
char sbuf[900];
int kselect;
void MkBuf()
{
char sta[300];
int ii;
strcpy(sbuf,"");
for(ii=0; ii<6; ii++){
sprintf(sta,"%dth line Test WinApi Test WinApi Test WinApi Test WinApi Test WinApi%c%c", 1+ii,0xD,0xA);
strcat(sbuf,sta);
}
}
void LSpace(HWND hwnd, int space)
{
//SendMessage(hedit, EM_SETSEL, 0, -1); // select all
PARAFORMAT2 pf;
pf.cbSize = sizeof(PARAFORMAT2);
pf.dwMask = PFM_LINESPACING;
pf.dyLineSpacing = space;
pf.bLineSpacingRule = 5; // (!)
SendMessage(hwnd, EM_SETPARAFORMAT, 0, (LPARAM)&pf);
//SendMessage(hedit, EM_SETSEL, -1, -1); // deselect
}
void EditColor(HWND l_hwnd, HDC l_hdc)
{
//if(l_hwnd == hedit){
SetTextColor(l_hdc,RGB(0,0,0));
SetBkColor(l_hdc,RGB(100,200,100));
//}
}
void Run_Key()
{
int kk;
kk = (kselect+1)%6; kselect += 1;
SendMessage(hedit,EM_SETSEL, kk*10,(kk+1)*10);
}
LRESULT CALLBACK EditSubProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
char chr;
switch (iMessage){
case WM_KEYDOWN:
chr = wParam;
if(GetAsyncKeyState(VK_CONTROL)){
if(chr == 'A'){ D_POP("Ctrl-A"); }
}
else if(chr == VK_F6){ D_POP("F6"); }
break;
}
return CallWindowProc(OldEditProc,hWnd,iMessage,wParam,lParam);
} // endof EditSubProc
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
//if(BRICHED == 2){ LoadLibrary("riched20.dll"); }
//else if(BRICHED == 4){ LoadLibrary("Msftedit.dll"); } // RichEdit 4.1
LoadLibrary("riched20.dll");
//LoadLibrary("Msftedit.dll"); // RichEdit 4.1
WNDCLASSEX wc = {0};
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpszClassName = "EditorWindowClass";
RegisterClassEx(&wc);
g_hInst = hInstance;
HWND hwnd = CreateWindowEx(0, "EditorWindowClass", "Text Editor", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
void Create_Main(HWND hwnd)
{
long ltype;
ltype = WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE;
// hEdit = CreateWindowEx(0, RICHEDIT_CLASS, "", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE,
// 0, 0, 800, 500, hwnd, (HMENU)ID_EDIT, NULL, NULL);
hedit = CreateWindowEx(0, RICHEDIT_CLASS, "", ltype, 0,0,800,500, hwnd, (HMENU)11, g_hInst, NULL);
//hedit = CreateWindowEx(0, MSFTEDIT_CLASS, "", ltype, 0,0,800,500, hwnd, (HMENU)11, g_hInst, NULL);
//if(BRICHED == 2){ hedit = CreateWindowEx(0, RICHEDIT_CLASS, "", ltype, 0,0,800,500, hwnd, (HMENU)11, g_hInst, NULL); }
//else if(BRICHED == 4){ hedit = CreateWindowEx(0, MSFTEDIT_CLASS, "", ltype, 0,0,800,500, hwnd, (HMENU)11, g_hInst, NULL); }
//else{ hedit = CreateWindow("edit", "MyEdit", ltype, 0,0,800,500, hwnd, (HMENU)11, g_hInst, NULL); }
LSpace(hedit, 50);
OldEditProc = (WNDPROC)SetWindowLong(hedit, GWL_WNDPROC, (LONG)EditSubProc);
////OldEditProc = (WNDPROC)SetWindowLongPtr(hedit, GWLP_WNDPROC, (LONG)EditSubProc);
MkBuf();
SetWindowText(hedit, sbuf);
kselect = 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
char ch;
HWND l_hwnd;
HDC l_hdc;
g_hwnd = hwnd;
l_hwnd = (HWND)lParam;
l_hdc=(HDC)wParam;
switch (uMsg) {
case WM_CREATE: {
Create_Main(hwnd);
break;
}
case WM_COMMAND:
break;
case WM_CTLCOLOREDIT:
EditColor(l_hwnd,l_hdc);
break;
case WM_KEYDOWN:
ch = wParam;
if(ch == 'Q'){ Run_Key(); }
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
使用 EM_SETBKGNDCOLOR 设置 RichEdit 控件的背景颜色。
您正在为 ANSI 而不是 UNICODE 编译代码,因此
RegisterClassEx()
和 CreateWindowEx()
分别映射到 RegisterClassExA()
和 CreateWindowExA()
。但 RichEdit 4.1(以及 MSFTEDIT_CLASS
定义)仅适用于 Unicode 窗口,它根本不支持 ANSI。对于 RichEdit 4.1,您需要使用 CreateWindowExW()
。
由于 Windows 本来就是一个 Unicode 操作系统,因此您最好只需重写代码以使用 Unicode 字符串和 Unicode 窗口 API。