RichEdit - фоновая картинка
От: dedpichto  
Дата: 21.11.07 20:07
Оценка:
Доброго всем времени суток!
Мне необ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та просто пропадают предыдущие строчки. Т.е. набрал третью строчку — пропала первая, четвертую — вторая и т.д. Что делать? Ведь как-то же это должно работать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.