Доброго всем времени суток!
Мне необxодимо добавить фоновое изображение в RichEdit (или сделать его прозрачным на худой конец).
Прогугал довольно много материала — ничего путного не нашел, все корявое. Набросал что-то похожее:
#define WIN32_LEAN_AND_MEAN /* speed up compilations */
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <tchar.h>
#include <richedit.h>
static LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM);
static BOOL Main_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct);
static void Main_OnDestroy(HWND);
static LRESULT APIENTRY EditProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
static HANDLE ghInstance;
static HBRUSH hBrush;
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
INITCOMMONCONTROLSEX icc;
WNDCLASS wc;
HWND hwnd;
MSG msg;
ghInstance = hInstance;
icc.dwSize = sizeof(icc);
icc.dwICC = ICC_WIN95_CLASSES /*|ICC_COOL_CLASSES|ICC_DATE_CLASSES|ICC_PAGESCROLLER_CLASS|ICC_USEREX_CLASSES*/;
InitCommonControlsEx(&icc);
LoadLibrary(_T("riched20.dll")); // Rich Edit v2.0, v3.0
/* Register the main window class */
ZeroMemory(&wc, sizeof(wc));
wc.lpszClassName = _T("RichEditTest");
wc.lpfnWndProc = MainWndProc;
wc.style = CS_OWNDC|CS_VREDRAW|CS_HREDRAW;
wc.hInstance = ghInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
wc.lpszMenuName = NULL;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
if (!RegisterClass(&wc))
return 1;
hwnd = CreateWindow(_T("RichEditTest"),
_T("RichEditTest"),
WS_OVERLAPPEDWINDOW, 0, 0, 400, 300, NULL, NULL, ghInstance, NULL);
if (!hwnd) return 1;
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
static LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
HANDLE_MSG(hwnd, WM_DESTROY, Main_OnDestroy);
HANDLE_MSG (hwnd, WM_CREATE, Main_OnCreate);
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
}
static BOOL Main_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
{
HWND hRich;
HBITMAP hBmp;
// hBmp = LoadBitmap(ghInstance, MAKEINTRESOURCE(8002));
hBmp = LoadBitmap(NULL, MAKEINTRESOURCE(32741));
hBrush = CreatePatternBrush(hBmp);
DeleteObject(hBmp);
hRich = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_TRANSPARENT, "RichEdit20A", NULL, WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_VSCROLL | WS_HSCROLL, 10, 10, 241, 221, hwnd, NULL, ghInstance, 0);
SetWindowLong(hRich, GWL_USERDATA, SetWindowLong(hRich, GWL_WNDPROC, (LONG)EditProc));
return TRUE;
}
static void Main_OnDestroy(HWND hwnd)
{
DeleteObject(hBrush);
PostQuitMessage(0);
}
static LRESULT APIENTRY EditProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
RECT rc;
// PAINTSTRUCT ps;
HDC hdc;
switch(msg){
case WM_PAINT:
hdc = GetDC(hwnd);
GetClientRect(hwnd, &rc);
FillRect(hdc, &rc, hBrush);
ReleaseDC(hwnd, hdc);
// BeginPaint(hwnd, &ps);
// FillRect(ps.hdc, &ps.rcPaint, hBrush);
// EndPaint(hwnd, &ps);
CallWindowProc((WNDPROC)GetWindowLong(hwnd, GWL_USERDATA), hwnd, msg, wParam, lParam);
return FALSE;
// case WM_ERASEBKGND:
// GetClientRect(hwnd, &rc);
// FillRect((HDC)wParam, &rc, hBrush);
// return FALSE;//CallWindowProc((WNDPROC)GetWindowLong(hwnd, GWL_USERDATA), hwnd, msg, wParam, lParam);
default:
return CallWindowProc((WNDPROC)GetWindowLong(hwnd, GWL_USERDATA), hwnd, msg, wParam, lParam);
}
}
Но в этом cлучае при наборе текcта просто пропадают предыдущие строчки. Т.е. набрал третью строчку — пропала первая, четвертую — вторая и т.д. Что делать? Ведь как-то же это должно работать?
а SetWindowLong( hRichEdit, GWL_EXSTYLE, WS_EX_TRANSPARENT ) не сработает?
Нет, тогда вообще полная лажа получается — вместо текста сплошная черная полоса. Есть правда способ — оставить richedit прозрачным и подложить под него static, у которого выставить SS_BITMAP стиль и дать ему какую-нибудь картинку. Но тогда любое перемещение курсора с помощью, скажем, клавиш, оставляет след от предыдущего положения курсора и т.д., словом тоже лажа.
Уф, решил.
Если человек идиот — это надолго.
Способ со static прекрасно работает, просто у меня обнаружился никому не нужный вызов RedrawWindow для richedit.
И не просто вызов — на WM_KEYDOWN
Ну, лучше все-таки самому себе признаться кто ты есть...