На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

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: обратная ИСТИНА;
}
обратная ЛОЖЬ;
}



Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz