使用C WinApi richedit时如何更改编辑背景颜色?

问题描述 投票:0回答:1

在下面的源代码中

(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;
}
c winapi background-color
1个回答
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。

© www.soinside.com 2019 - 2024. All rights reserved.