|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Example of a Clipboard Viewer
The following example shows a simple clipboard viewer application.
HINSTANCE hinst; UINT uFormat = (UINT)(-1); BOOL fAuto = TRUE; LRESULT APIENTRY MainWndProc(hwnd, uMsg, wParam, lParam) HWND hwnd; UINT uMsg; WPARAM wParam; LPARAM lParam; { static HWND hwndNextViewer; HDC hdc; HDC hdcMem; PAINTSTRUCT ps; LPPAINTSTRUCT lpps; RECT rc; LPRECT lprc; HGLOBAL hglb; LPSTR lpstr; HBITMAP hbm; HENHMETAFILE hemf; HWND hwndOwner; switch (uMsg) {
case WM_PAINT: hdc = BeginPaint(hwnd, &ps); // Branch depending on the clipboard format. switch (uFormat) { case CF_OWNERDISPLAY: hwndOwner = GetClipboardOwner(); hglb = GlobalAlloc(GMEM_DDESHARE, sizeof(PAINTSTRUCT)); lpps = GlobalLock(hglb); memcpy(lpps, &ps, sizeof(PAINTSTRUCT));
GlobalUnlock(hglb); SendMessage(hwndOwner, WM_PAINTCLIPBOARD, (WPARAM) hwnd, (LPARAM) hglb); GlobalFree(hglb); break; case CF_BITMAP: hdcMem = CreateCompatibleDC(hdc); if (hdcMem != NULL) { if (OpenClipboard(hwnd)) { hbm = (HBITMAP)
GetClipboardData(uFormat); SelectObject(hdcMem, hbm); GetClientRect(hwnd, &rc); BitBlt(hdc, 0, 0, rc.right, rc.bottom, hdcMem, 0, 0, SRCCOPY); CloseClipboard(); } DeleteDC(hdcMem); } break;
case CF_TEXT: if (OpenClipboard(hwnd)) { hglb = GetClipboardData(uFormat); lpstr = GlobalLock(hglb); GetClientRect(hwnd, &rc); DrawText(hdc, lpstr, -1, &rc, DT_LEFT); GlobalUnlock(hglb); CloseClipboard(); } break;
case CF_ENHMETAFILE: if (OpenClipboard(hwnd)) { hemf = GetClipboardData(uFormat); GetClientRect(hwnd, &rc); PlayEnhMetaFile(hdc, hemf, &rc); CloseClipboard(); } break; case 0: GetClientRect(hwnd, &rc); DrawText(hdc, "The clipboard is empty.", -1,
&rc, DT_CENTER | DT_SINGLELINE | DT_VCENTER); break; default: GetClientRect(hwnd, &rc); DrawText(hdc, "Unable to display format.", -1, &rc, DT_CENTER | DT_SINGLELINE | DT_VCENTER); } EndPaint(hwnd, &ps); break; case WM_SIZE: if (uFormat == CF_OWNERDISPLAY)
{ hwndOwner = GetClipboardOwner(); hglb = GlobalAlloc(GMEM_DDESHARE, sizeof(RECT)); lprc = GlobalLock(hglb); GetClientRect(hwnd, lprc); GlobalUnlock(hglb); SendMessage(hwndOwner, WM_SIZECLIPBOARD, (WPARAM) hwnd, (LPARAM) hglb); GlobalFree(hglb); } break; case WM_CREATE:
// Add the window to the clipboard viewer chain. hwndNextViewer = SetClipboardViewer(hwnd); break; case WM_CHANGECBCHAIN: // If the next window is closing, repair the chain. if ((HWND) wParam == hwndNextViewer) hwndNextViewer = (HWND) lParam; // Otherwise, pass the message to the next link. else if (hwndNextViewer != NULL) SendMessage(hwndNextViewer, uMsg, wParam, lParam);
break; case WM_DESTROY: ChangeClipboardChain(hwnd, hwndNextViewer); PostQuitMessage(0); break; case WM_DRAWCLIPBOARD: // clipboard contents changed. // Update the window by using Auto clipboard format. SetAutoView(hwnd); // Pass the message to the next window in clipboard // viewer chain. SendMessage(hwndNextViewer, uMsg, wParam, lParam);
break; case WM_INITMENUPOPUP: if (!HIWORD(lParam)) InitMenu(hwnd, (HMENU) wParam); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_EXIT: DestroyWindow(hwnd); break; case IDM_AUTO: SetAutoView(hwnd); break; default:
fAuto = FALSE; uFormat = LOWORD(wParam); InvalidateRect(hwnd, NULL, TRUE); } break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return (LRESULT) NULL; } void WINAPI SetAutoView(HWND hwnd) { static UINT auPriorityList[] = { CF_OWNERDISPLAY, CF_TEXT, CF_ENHMETAFILE, CF_BITMAP
}; uFormat = GetPriorityClipboardFormat(auPriorityList, 4); fAuto = TRUE; InvalidateRect(hwnd, NULL, TRUE); UpdateWindow(hwnd); } void WINAPI InitMenu(HWND hwnd, HMENU hmenu) { UINT uFormat; char szFormatName[80]; LPCSTR lpFormatName; UINT fuFlags; UINT idMenuItem; // If a menu is not the display menu, no initialization is necessary. if (GetMenuItemID(hmenu, 0) != IDM_AUTO) return;
// Delete all menu items except the first. while (GetMenuItemCount(hmenu) > 1) DeleteMenu(hmenu, 1, MF_BYPOSITION); // Check or uncheck the Auto menu item. fuFlags = fAuto ? MF_BYCOMMAND | MF_CHECKED : MF_BYCOMMAND | MF_UNCHECKED; CheckMenuItem(hmenu, IDM_AUTO, fuFlags); // If there are no clipboard formats, return. if (CountClipboardFormats() == 0) return; // Open the clipboard.
if (!OpenClipboard(hwnd)) return; // Add a separator and then a menu item for each format. AppendMenu(hmenu, MF_SEPARATOR, 0, NULL); uFormat = EnumClipboardFormats(0); while (uFormat) { // Call an application-defined function to get the name // of the clipboard format. lpFormatName = GetPredefinedClipboardFormatName(uFormat); // For registered formats, get the registered name.
if (lpFormatName == NULL) { if (GetClipboardFormatName(uFormat, szFormatName, sizeof(szFormatName))) lpFormatName = szFormatName; else lpFormatName = "(unknown)"; } // Add a menu item for the format. For displayable // formats, use the format ID for the menu ID. if (IsDisplayableFormat(uFormat)) { fuFlags = MF_STRING;
idMenuItem = uFormat; } else { fuFlags = MF_STRING | MF_GRAYED; idMenuItem = 0; } AppendMenu(hmenu, fuFlags, idMenuItem, lpFormatName); uFormat = EnumClipboardFormats(uFormat); } CloseClipboard(); } BOOL WINAPI IsDisplayableFormat(UINT uFormat) { switch (uFormat) { case CF_OWNERDISPLAY: case CF_TEXT: case CF_ENHMETAFILE:
case CF_BITMAP: return TRUE; } return FALSE; }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Пример Clipboard Viewer
Следующий пример показывает приложение зрителя простого планшета.
HINSTANCE hinst; UINT uFormat = (UINT)(-1); BOOL fAuto = ИСТИНА; LRESULT APIENTRY MainWndProc(hwnd, uMsg, wParam, lParam) HWND hwnd; UINT uMsg; WPARAM wParam; LPARAM lParam; { статический HWND hwndNextViewer; hdc HDC; HDC hdcMem; ps PAINTSTRUCT; lpps LPPAINTSTRUCT; rc RECT; LPRECT lprc; HGLOBAL hglb; LPSTR lpstr; hbm HBITMAP; HENHMETAFILE hemf; HWND hwndOwner; ключ (uMsg) {
случай WM_PAINT: hdc = BeginPaint(hwnd, &ps); // Ветка в зависимости от буфера формата. ключ (uFormat) { случай CF_OWNERDISPLAY: hwndOwner = GetClipboardOwner(); hglb = GlobalAlloc(GMEM_DDESHARE, sizeof(PAINTSTRUCT)); lpps = GlobalLock(hglb); memcpy(lpps, &ps, sizeof(PAINTSTRUCT));
GlobalUnlock(hglb); SendMessage(hwndOwner, WM_PAINTCLIPBOARD, (WPARAM) hwnd, (LPARAM) hglb); GlobalFree(hglb); прерывание; случай CF_BITMAP: hdcMem = CreateCompatibleDC(hdc); если (hdcMem != НЕДЕЙСТВИТЕЛЬНЫЙ) { если (OpenClipboard(hwnd)) { hbm = (HBITMAP)
GetClipboardData(uFormat); SelectObject(hdcMem, hbm); GetClientRect(hwnd, &rc); BitBlt(hdc, 0, 0, rc.right, rc.bottom, hdcMem, 0, 0, SRCCOPY); CloseClipboard(); } DeleteDC(hdcMem); } прерывание;
случай CF_TEXT: если (OpenClipboard(hwnd)) { hglb = GetClipboardData(uFormat); lpstr = GlobalLock(hglb); GetClientRect(hwnd, &rc); DrawText(hdc, lpstr, -1, &rc, DT_LEFT); GlobalUnlock(hglb); CloseClipboard(); } прерывание;
случай CF_ENHMETAFILE: если (OpenClipboard(hwnd)) { hemf = GetClipboardData(uFormat); GetClientRect(hwnd, &rc); PlayEnhMetaFile(hdc, hemf, &rc); CloseClipboard(); } прерывание; случай 0: GetClientRect(hwnd, &rc); DrawText(hdc, " БУФЕР пустой.", -1,
&rc, DT_CENTER | DT_SINGLELINE | DT_VCENTER); прерывание; умолчание: GetClientRect(hwnd, &rc); DrawText(hdc, "НЕ В СОСТОЯНИИ отобразить формат.", -1, &rc, DT_CENTER | DT_SINGLELINE | DT_VCENTER); } EndPaint(hwnd, &ps); прерывание; случай WM_SIZE: если (uFormat == CF_OWNERDISPLAY)
{ hwndOwner = GetClipboardOwner(); hglb = GlobalAlloc(GMEM_DDESHARE, sizeof(RECT)); lprc = GlobalLock(hglb); GetClientRect(hwnd, lprc); GlobalUnlock(hglb); SendMessage(hwndOwner, WM_SIZECLIPBOARD, (WPARAM) hwnd, (LPARAM) hglb); GlobalFree(hglb); } прерывание; случай WM_CREATE:
// Добавьте окно к буферу цепи абонента. hwndNextViewer = SetClipboardViewer(hwnd); прерывание; случай WM_CHANGECBCHAIN: // Если следующее окно закрывается, исправьте цепь. если ((HWND) wParam == hwndNextViewer) hwndNextViewer = (HWND) lParam; // В противном случае, передавать сообщение на следующую связь. еще если (hwndNextViewer != НЕДЕЙСТВИТЕЛЬНЫЙ) SendMessage(hwndNextViewer, uMsg, wParam, lParam);
прерывание; случай WM_DESTROY: ChangeClipboardChain(hwnd, hwndNextViewer); PostQuitMessage(0); прерывание; случай WM_DRAWCLIPBOARD: // буфер содержания изменялся. // Скорректируйте окно используя Авто формат буфера. SetAutoView(hwnd); // Проход сообщение в следующее окно в буфере // цепь абонента. SendMessage(hwndNextViewer, uMsg, wParam, lParam);
прерывание; случай WM_INITMENUPOPUP: если (!HIWORD(lParam)) InitMenu(hwnd, (HMENU) wParam); прерывание; случай WM_COMMAND: ключ (LOWORD(wParam)) { случай IDM_EXIT: DestroyWindow(hwnd); прерывание; случай IDM_AUTO: SetAutoView(hwnd); прерывание; умолчание:
fAuto = ЛОЖЬ; uFormat = LOWORD(wParam); InvalidateRect(hwnd, НЕДЕЙСТВИТЕЛЬНАЯ, ИСТИНА); } прерывание; умолчание: возвращайте DefWindowProc(hwnd, uMsg, wParam, lParam); } возврат (LRESULT) НЕДЕЙСТВИТЕЛЬНЫЙ; } пустота WINAPI SetAutoView(HWND hwnd) { статический UINT auPriorityList[] = { CF_OWNERDISPLAY, CF_TEXT, CF_ENHMETAFILE, CF_BITMAP
}; uFormat = GetPriorityClipboardFormat(auPriorityList, 4); fAuto = ИСТИНА; InvalidateRect(hwnd, НЕДЕЙСТВИТЕЛЬНАЯ, ИСТИНА); UpdateWindow(hwnd); } пустота WINAPI InitMenu(HWND hwnd, HMENU hmenu) { UINT uFormat; символ szFormatName[80]; LPCSTR lpFormatName; UINT fuFlags; UINT idMenuItem; // Если меню не является дисплейным меню, никакая инициализация не нужна. если возврат (GetMenuItemID(hmenu, 0) != IDM_AUTO);
// Удалите все пункты меню кроме первый. пока (GetMenuItemCount(hmenu) > 1) DeleteMenu(hmenu, 1, MF_BYPOSITION); // Проверьте или uncheck Авто пункт меню. fuFlags = fAuto? MF_BYCOMMAND | MF_CHECKED : MF_BYCOMMAND | MF_UNCHECKED; CheckMenuItem(hmenu, IDM_AUTO, fuFlags); // Если нет буфера форматов, возвращайтесь. если возврат (CountClipboardFormats() == 0); // Открытый буфер.
если (!OpenClipboard ВОЗВРАТА(hwnd)); // Добавьте разделитель и затем пункт меню для каждого формата. AppendMenu(hmenu, MF_SEPARATOR, 0, НЕДЕЙСТВИТЕЛЬНЫЙ); uFormat = EnumClipboardFormats(0); пока (uFormat) { // Вызов определенная прикладная функция, чтобы получать имя // буфера формата. lpFormatName = GetPredefinedClipboardFormatName(uFormat); // Для зарегистрированных форматов, получите зарегистрированное имя.
если (lpFormatName == НЕДЕЙСТВИТЕЛЬНЫЙ) { если (GetClipboardFormatName(uFormat, szFormatName, sizeof(szFormatName))) lpFormatName = szFormatName; еще lpFormatName = "(НЕИЗВЕСТНЫЙ)"; } // Добавьте пункт меню для формата. Для воспроизводимых // форматов, используйте формат ID для меню ID. если (IsDisplayableFormat(uFormat)) { fuFlags = MF_STRING;
idMenuItem = uFormat; } еще { fuFlags = MF_STRING | MF_GRAYED; idMenuItem = 0; } AppendMenu(hmenu, fuFlags, idMenuItem, lpFormatName); uFormat = EnumClipboardFormats(uFormat); } CloseClipboard(); } BOOL WINAPI IsDisplayableFormat(UINT uFormat) { ключ (uFormat) { случай CF_OWNERDISPLAY: случай CF_TEXT: случай CF_ENHMETAFILE:
случай CF_BITMAP: обратная ИСТИНА; } обратная ЛОЖЬ; }
|
|
|
|
| |