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та просто пропадают предыдущие строчки. Т.е. набрал третью строчку — пропала первая, четвертую — вторая и т.д. Что делать? Ведь как-то же это должно работать?
Re: RichEdit - фоновая картинка
От: StDenis Россия  
Дата: 22.11.07 06:47
Оценка:
а SetWindowLong( hRichEdit, GWL_EXSTYLE, WS_EX_TRANSPARENT ) не сработает?
Re[2]: RichEdit - фоновая картинка
От: dedpichto  
Дата: 22.11.07 08:01
Оценка:
Нет, тогда вообще полная лажа получается — вместо текста сплошная черная полоса. Есть правда способ — оставить richedit прозрачным и подложить под него static, у которого выставить SS_BITMAP стиль и дать ему какую-нибудь картинку. Но тогда любое перемещение курсора с помощью, скажем, клавиш, оставляет след от предыдущего положения курсора и т.д., словом тоже лажа.
Re[3]: RichEdit - фоновая картинка
От: StDenis Россия  
Дата: 22.11.07 11:34
Оценка:
может тогда стоит помучаться с Windowless RichEdit?
Re: RichEdit - фоновая картинка
От: kaz  
Дата: 22.11.07 11:49
Оценка:
Здравствуйте, dedpichto, Вы писали:

D>Доброго всем времени суток!

D>Мне необxодимо добавить фоновое изображение в RichEdit (или сделать его прозрачным на худой конец).
D>Прогугал довольно много материала — ничего путного не нашел, все корявое. Набросал что-то похожее:

Возможно, ты сам зарисовывашь такст. РичЕдит при наборе 3 строки не перерисовывает первую, а оставляет ее такой какая она была, а на нее накидываеш свой FillRect, может стоит попробовать перед твоей зарисовкой получить из hdc bitmap и сохранить его, а потом посмотреть поверх чего ты рисуешь... это просто предположение, если попробуешь, скажи что получится!
Re[4]: RichEdit - фоновая картинка
От: dedpichto  
Дата: 22.11.07 11:50
Оценка:
Уф, решил.
Если человек идиот — это надолго.
Способ со static прекрасно работает, просто у меня обнаружился никому не нужный вызов RedrawWindow для richedit.
И не просто вызов — на WM_KEYDOWN
Ну, лучше все-таки самому себе признаться кто ты есть...
Re[2]: RichEdit - фоновая картинка
От: dedpichto  
Дата: 22.11.07 12:38
Оценка:
Здравствуйте, kaz, Вы писали:

kaz>Возможно, ты сам зарисовывашь такст.


Очень может быть. Ну, раз работает со статик — удовлетворюсь пока этим, спасибо за подсказку.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.