Использование собственного дисплейного формата буфера обмена


Если окно помещает информацию в буфер обмена при помощи использования формата CF_OWNERDISPLAY, оно должно сделать нижеследующее:

Оконная процедура  прикладной программы  Label обрабатывает  эти сообщения, как ниже указано.

Демонстрационный пример

LRESULT CALLBACK MainWindowProc(hwnd, msg, wParam, lParam) 
HWND hwnd; 
UINT msg; 
WPARAM wParam; 
LPARAM lParam; 
{ 
    static RECT rcViewer; 
 
    RECT rc; 
    LPRECT lprc; 
    LPPAINTSTRUCT lpps; 
 
    switch (msg) 
    { 
        //
        // Обработка других сообщений.
        //
        case WM_PAINTCLIPBOARD: 
            // Определяем размеры ярлыка. 
 
            SetRect(&rc, 0, 0, 
                pboxLocalClip->rcText.right + CX_MARGIN, 
                pboxLocalClip->rcText.top * 2 + cyText 
            ); 
 
            // Центруем изображение в окне просмотра буфера обмена. 
 
            if (rc.right < rcViewer.right) 
            { 
                rc.left = (rcViewer.right - rc.right) / 2; 
                rc.right += rc.left; 
            } 
            if (rc.bottom < rcViewer.bottom) 
            { 
                rc.top = (rcViewer.bottom - rc.bottom) / 2; 
                rc.bottom += rc.top; 
            } 
 
            // Рисуем изображение, используя установленную структуру
            // PAINTSTRUCT, вызвав определяемую программой
            // функцию PaintLabel. 
 
            lpps = (LPPAINTSTRUCT) GlobalLock((HGLOBAL) lParam); 
            PaintLabel(lpps, pboxLocalClip, &rc); 
            GlobalUnlock((HGLOBAL) lParam); 
            break; 
 
        case WM_SIZECLIPBOARD: 
            // Сохраняем размеры окна в статической
            // структуре RECT.
 
            lprc = (LPRECT) GlobalLock((HGLOBAL) lParam); 
            memcpy(&rcViewer, lprc, sizeof(RECT)); 
            GlobalUnlock((HGLOBAL) lParam); 
 
            // Устанавливаем диапазон прокрутки от нуля(это исключение
            // требуют обработки сообщений WM_HSCROLLCLIPBOARD и
            // WM_VSCROLLCLIPBOARD). 
 
            SetScrollRange((HWND) wParam, SB_HORZ, 0, 0, TRUE); 
            SetScrollRange((HWND) wParam, SB_VERT, 0, 0, TRUE); 
 
            break; 
 
        case WM_ASKCBFORMATNAME: 
            LoadString(hinst, IDS_OWNERDISPLAY, 
                (LPSTR) lParam, wParam); 
            break; 
 
        default: 
            return DefWindowProc(hwnd, msg, wParam, lParam); 
    } 
    return 0; 
}

 

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz