国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

在 Windows 應用程序中運用 Windows XP 的外觀風格與 PrintWindow(轉)

在 Windows 應用程序中運用 Windows XP 的外觀風格與 PrintWindow(轉)

更新時間:2022-05-10 文章作者:未知 信息來源:網絡 閱讀次數:

注意:此示例僅適用于運行 Windows XP 的計算機。打開示例并打開兩個或多個應用程序窗口之后,請使用 AltTab 功能鍵來運行 TaskSwitcher 應用程序。
摘要:本文介紹了一種增強的 AltTab 應用程序 TaskSwitcher,并以此為框架演示了在 Windows 應用程序中使用 Windows XP 新的外觀風格和 PrintWindow 的方法。

目錄
簡介
TaskSwitcher 應用程序
截取鍵盤輸入
枚舉頂層應用程序窗口
顯示頂層應用程序窗口
使用 Comctl32.dll 版本 6
總結
簡介
Microsoft® Windows® XP 引入了一種新的外觀風格,它使用方便,并且用戶界面也更加豐富。例如,圓角窗口、更具質感的任務欄以及將鼠標懸停在 UI 元素上時,可實現 UI 元素的熱跟蹤。



圖 1:新外觀風格中的 Calculator(計算器)和 Display Properties(顯示屬性)對話框

Windows XP 還引入了新的打印 API:PrintWindow(英文)。該 API 允許調用者制作窗口的快照并將其插入設備環境。

有關外觀風格以及將其應用于應用程序的介紹,請參閱 MSDN Library 中的技術文章“使用 Windows XP 的外觀風格”。該文章提供了相關的概述和介紹信息,而本文的主要目的是提供一個使用外觀風格 API 和 PrintWindow API 的實例。本文還為使用某些以前的 Win32 API 提供了一個刷新程序。

本文將特別闡述 TaskSwitcher 應用程序,它與目前 Windows 中已有的 AltTab 機制具有相同的功能。除了顯示圖標列表外,該應用程序還將顯示將要切換到的應用程序的縮略圖預覽。顯示應用程序圖標和預覽的容器窗口將通過外觀風格 API 顯示出來,使應用程序的外觀符合最終用戶當前選擇的外觀風格。

TaskSwitcher 應用程序
TaskSwitcher 是為代替 Windows XP 的現有 AltTab 應用程序切換機制而設計的。AltTab 是內置的 Windows 超級用戶功能,它使最終用戶能夠在頂層應用程序窗口之間進行快速切換。當按下熱鍵組合 Alt+Tab 時,Windows 會生成最終用戶正在使用的已打開窗口的列表。已打開窗口的列表將以一組圖標的形式顯示,其中一個圖標帶有矩形的選擇邊框。當最終用戶繼續按住 Alt 鍵并按下 Tab 鍵時,矩形選擇框將移至下一個圖標。釋放 Alt 鍵后,Windows 將把選定的圖標所代表的應用程序置于前臺。



圖 2:Windows XP AltTab 容器窗口

此功能在邏輯上可以分成三個部分:首先,應用程序必須偵聽組合鍵 Alt+Tab;接收到該組合鍵時,應用程序需要枚舉桌面上的頂層應用程序窗口;最后,應用程序需要在某種 UI 容器中顯示這些窗口,使用戶可以選擇要切換到的應用程序的圖標。

截取鍵盤輸入
使用 Win32 API,您可以通過幾種方法之一創建偵聽特定擊鍵的應用程序。最簡單的方法是使用 API RegisterHotKey(英文)。該 API 包含一個 hwnd、一個 ID、一個虛擬鍵和一個組合鍵。如果此調用成功,則無論何時按下虛擬鍵和組合鍵,hwnd 的 WndProc 都會收到一個 WM_HOTKEY 消息,該消息的 wParam 等于 ID。無論偵聽應用程序窗口是否處于活動狀態,都是如此。無論何時按下 AltTab,下面的調用都會使 hwndApp 收到一條 WM_HOTKEY 消息:

RegisterHotKey(hwndApp, IDH_ALTTAB, MOD_ALT, VK_TAB)

在 Windows XP 之前,無法將 AltTab 注冊為熱鍵。在 Windows XP 中,您不僅可以成功地將 AltTab 注冊為熱鍵,而且 Windows XP 還使您可以自己處理該事件,而不用啟動其自身內置的 AltTab 熱鍵處理程序。

// 創建一個偵聽熱鍵的虛擬窗口
HWND hwndApp = CreateWindow(WC_APP, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE,
 NULL, THIS_EXE, NULL);
if (hwnd)
{
// 注冊 Alt+Tab
RegisterHotKey(hwndApp, IDH_NEXT, MOD_ALT, VK_TAB);
RegisterHotKey(hwndApp, IDH_PREV, MOD_ALT|MOD_SHIFT, VK_TAB);

MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

LRESULT WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_HOTKEY:
{
switch (wParam)
{
// 如果未顯示容器窗口,則枚舉
// 頂層窗口,提取圖標和文本,
// 并將其顯示在容器窗口中
case IDH_NEXT:
{
// 在窗口層次結構中選擇
// 下一個頂層窗口的圖標
break;
}
case IDH_PREV:
{
// 在窗口層次結構中選擇
// 上一個頂層窗口的圖標
}
}
}
}
}

第二種實現鍵盤偵聽的更高級的方法是同時使用 API SetWindowsHookEx(英文)和 WH_KEYBOARD_LL。該方法在當前桌面的全局范圍內創建一個低級別的鍵盤掛鉤層。在調用 SetWindowsHookEx 時指定的 LowLevelKeyboardProc 回調函數將接收所有的鍵盤輸入。處理完鍵盤輸入后,LowLevelKeyboardProc 應調用 CallNextHookEx 以使下一個掛鉤鏈(很可能是目標應用程序)能夠接收輸入。由于 LowLevelKeyboardProc 接收了所有的鍵盤事件,因此可以很容易地將其用作一個狀態機,用于偵聽同時按下的 Alt 和 Tab 組合鍵。如果該應用程序實現它自己的 AltTab 機制,則此時將執行窗口枚舉算法,并從 LowLevelKeyboardHook 中返回而不把最后的 AltTab 鍵事件轉給其他應用程序。

hhook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hinst, 0);

LRESULT LowLevelKeyboardProc(INT nCode, WPARAM wParam, LPARAM lParam)
{
static BOOL fShiftPressed = FALSE;

BOOL fHandled = FALSE;

if (nCode == HC_ACTION)
{
KBDLLHOOKSTRUCT *pkbdllhook = (KBDLLHOOKSTRUCT *)lParam;

switch (wParam)
{
case WM_SYSKEYDOWN:
switch (pkbdllhook->vkCode)
{
case VK_LSHIFT:
case VK_RSHIFT:
{
// 用戶按下 Shift 鍵
fShiftPressed = TRUE;
break;
}
case VK_TAB:
{
if (pkbdllhook->flags & LLKHF_ALTDOWN)
{
// 用戶按下 Alt+Tab,執行 AltTab 熱鍵處理程序
fHandled = TRUE;
}
break;
}
case VK_ESCAPE:
{
if (pkbdllhook->flags & LLKHF_ALTDOWN)
{
// 用戶按下 Esc 鍵,關閉 AltTab 容器窗口
// 并且不切換到選定窗口
fHandled = TRUE;
}
break;
}
}

break;

case WM_KEYUP:
case WM_SYSKEYUP:
switch (pkbdllhook->vkCode)
{
case VK_LMENU:
case VK_RMENU:
{
// 用戶釋放 Alt 鍵,關閉 AltTab 容器窗口
// 并切換到選定窗口
break;
}
case VK_LSHIFT:
case VK_RSHIFT:
{
// 用戶釋放 Shift 鍵
fShiftPressed = FALSE;
break;
}
}

break;
}
}

return (fHandled ? TRUE : CallNextHookEx(hhook, nCode, wParam, lParam));
}

枚舉頂層應用程序窗口
使用 Win32 API EnumWindows(英文)可以直接枚舉頂層應用程序窗口。這個 API 接受 EnumFunc 回調函數作為參數。對于桌面上的每個頂層窗口,系統將用頂層窗口的窗口句柄作為參數,來調用 EnumFunc 函數。并不是所有的頂層窗口都應顯示在 AltTab 列表中。需要查詢窗口的一些屬性,并且必須滿足幾個條件:窗口是應用程序窗口嗎?窗口能被激活嗎?窗口可視嗎?窗口是 ToolWindow 嗎?

接收到 AltTab 事件之后,TaskSwitcher 便開始使用 EnumWindows 枚舉桌面上的頂層窗口。系統為每個頂層窗口調用回調函數。滿足條件的窗口將被添加到窗口列表中,并顯示在 AltTab 列表中。

顯示頂層應用程序窗口
在 AltTab 列表的 UI 顯示中,TaskSwitcher 使用了很多 Windows XP 的新編程功能。它使用新的 API DrawShadowText 來顯示選定的應用程序的文本,使用新的 API PrintWindow 來生成窗口預覽。最后,而且也許是應用程序開發人員最感興趣的,TaskSwitcher 使用了 Windows XP 的新外觀風格。

收集窗口信息
生成要在 AltTab 列表中顯示的窗口列表后,會檢索列表中每個窗口的各種屬性并將其顯示在預覽容器中。通過向該窗口發送一個 WM_GETICON(英文)窗口消息,在列表中顯示每個窗口的圖標。當用戶按 Tab 鍵在列表中移動時,列表中選定的應用程序圖標的圖標和文本將顯示在預覽容器的頂部。通過使用 API GetWindowText(英文)來檢索每個窗口的標題文本。有趣的是,它使用了新的 API comctl32 v6 API DrawShadowText(英文)來顯示應用程序文本。該 API 是 Windows XP 的新增功能,采用了 API DrawText 的所有相同參數,還有兩個表示文本顏色和陰影顏色的 COLORREF 參數,以及陰影的 x 偏移量和 y 偏移量。

繪制窗口預覽
TaskSwitcher 還可以顯示選定窗口的縮略圖預覽。(除非最小化所預覽的窗口,因為此時將只顯示該窗口的標題欄。)繪制縮略圖預覽時,TaskSwitcher 采用了一些高級的 Win32 繪圖技術,例如雙重緩沖和半色調縮放等。然而,獲取窗口預覽的核心技術是新的 Windows XP user32 API PrintWindow。PrintWindow 帶有一個窗口句柄、一個 hdc 和一個保留標志。該 API 使用窗口重定向,將窗口的快照繪制到 hdc 中。

// 制作窗口 hwnd 的快照,該窗口存儲在內存設備環境 hdcMem 中
HDC hdc = GetWindowDC(hwnd);
if (hdc)
{
HDC hdcMem = CreateCompatibleDC(hdc);
if (hdcMem)
{
RECT rc;
GetWindowRect(hwnd, &rc);

HBITMAP hbitmap = CreateCompatibleBitmap(hdc, RECTWIDTH(rc), RECTHEIGHT(rc));
if (hbitmap)
{
SelectObject(hdcMem, hbitmap);

PrintWindow(hwnd, hdcMem, 0);

DeleteObject(hbitmap);
}
DeleteObject(hdcMem);
}
ReleaseDC(hwnd, hdc);
}

使用外觀風格 API 來顯示容器
所有這些都繪制在容器窗口上。容器窗口的背景體現了 Windows XP 的新外觀風格。也就是說,它和 Windows XP 的其余部分具有相同的外觀,包括圓角窗口以及與標題欄類似的更具質感的圖案背景。顯示容器背景時,TaskSwitcher 使用了 uxtheme.h 中的很多新的主題 API,例如 OpenThemeData(英文)、CloseThemeData(英文)、GetThemeBackgroundRegion(英文)和 DrawThemeBackground(英文)。在本例中,我們把用于開始面板頂部的外觀風格用作容器窗口的背景。

#include <uxtheme.h>
#include <tmschema.h>

// AltTab 列表容器窗口的對話框程序
INT_PTR CALLBACK DlgProc(HWND hwnd, UINT uMsg, WPARAM, LPARAM lParam)
{
static HTHEME htheme = NULL;

switch (uMsg)
{
case WM_INITDIALOG:
{
htheme = OpenThemeData(hwnd, L"StartPanel");

if (htheme)
{
// 獲取要用于繪制容器窗口的
// 背景區域部分并將其應用于
// 對話框。

HRGN hrgn = NULL;
GetWindowRect(hwnd, &rc);
OffsetRect(&rc, -rc.left, -rc.top);

if (SUCCEEDED(GetThemeBackgroundRegion(htheme, NULL,
 SPP_USERPANE, 0, &rc, &hrgn)))
{
SetWindowRgn(hwnd, hrgn, FALSE);
}
}

break;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
if (hdc)
{
if (htheme)
{
// 外觀風格處于活動狀態,使用外觀
// 風格 API 進行繪制。

RECT rc;
GetWindowRect(hwnd, &rc);
OffsetRect(&rc, -rc.left, -rc.top);

DrawThemeBackground(htheme, hdc, SPP_USERPANE, 0, &rc, NULL);
}
else
{
// 外觀風格不處于活動狀態,按傳統
// 窗口樣式進行繪制。
}
}
EndPaint(hwnd, &ps);

break;
}
case WM_THEMECHANGED:
{
// 外觀風格已更改,關閉現有的 htheme 并嘗試
// 打開一個新的 htheme。
if (htheme)
{
CloseThemeData(htheme);
}
htheme = OpenThemeData(hwnd, L"StartPanel");

break;
}
}
}



圖 3:TaskSwitcher AltTab 容器窗口

使用 Comctl32.dll 版本 6
Taskswitcher 利用了 comctl32.dll 版本 6 中的一些新功能。例如,圖標列表使用 ListView 控件制作;容器的背景使用了匹配的背景水印,從而達到與窗口其余部分的自然融合。此外,API DrawShadowText 也是在 comctl32 v6 中找到的。

Comctl32 版本 6 是一個并行 DLL,即 comctl32.dll 版本 5 和版本 6 是同時安裝在系統上的。默認情況下,當應用程序與 comctl32.lib 靜態鏈接時,將使用版本 5。為了使應用程序能夠使用版本 6,必須提供一個如下的應用程序聲明文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="Microsoft.Shell.TaskSwitch "
type="win32"
/>
<description>TaskSwitcher:AltTab 替代程序。</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>

然后通過在 .rc 文件中指定以下行,將該聲明文件編入應用程序的資源部分。

CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "TaskSwitch.exe.manifest"

總結
Windows XP 提供了一個全新的用戶界面,包括新的外觀風格以及能夠直觀捕獲窗口內容的能力。使用本文介紹的技術,開發人員可以利用外觀風格 API 為其應用程序設計一個可以與 Windows XP 其余部分的外觀相匹配的獨特外觀。使用 PrintWindow,開發人員可以制作指定窗口的快照并將其插入設備環境。

 

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

国产午夜成人免费看片无遮挡_日本免费xxxx色视频_免费人成网上在线观看_黄网址在线永久免费观看

  • <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        国产一区二区三区四| 日韩免费观看高清完整版| 欧美亚洲愉拍一区二区| 日本欧美在线看| 亚洲视频在线一区二区| 一区二区三区在线观看网站| 日本欧美一区二区| 国产精品亚洲专一区二区三区 | 99热国产精品| 日韩精品一级中文字幕精品视频免费观看 | 高清国产一区二区三区| 午夜视频在线观看一区二区三区| 亚洲最新在线观看| 337p粉嫩大胆噜噜噜噜噜91av| 欧美日本一道本| 天堂在线亚洲视频| 亚洲一区二区欧美日韩 | 国产精品私人影院| 高清日韩电视剧大全免费| 亚洲欧美综合另类在线卡通| 亚洲欧美色图小说| 丁香婷婷综合色啪| 成人av电影在线观看| 欧美日韩mp4| 免费欧美日韩国产三级电影| 在线观看av不卡| 国产欧美精品一区二区色综合朱莉| 石原莉奈在线亚洲三区| 久久综合久久综合久久| 91黄色免费版| 日本网站在线观看一区二区三区 | 成人成人成人在线视频| 日韩成人免费看| 日韩精品一区二区三区视频播放| 国产精品99久久久久| 亚洲不卡一区二区三区| 国产精品久久久久久久久免费相片 | 欧美日韩免费视频| 国产精品乱人伦中文| 久久久国产精品午夜一区ai换脸| 欧美国产激情一区二区三区蜜月| 亚洲欧美日韩在线不卡| 极品销魂美女一区二区三区| 成人av综合在线| 欧美电视剧在线观看完整版| 亚洲一区二区偷拍精品| 色狠狠av一区二区三区| 欧美女孩性生活视频| 精品视频资源站| 欧美一区中文字幕| 欧美韩日一区二区三区四区| 中文字幕欧美一区| 性做久久久久久免费观看欧美| 老司机精品视频一区二区三区| 国内成+人亚洲+欧美+综合在线 | 天堂久久久久va久久久久| 日韩电影在线看| 成人免费电影视频| 欧美日韩国产高清一区二区三区 | 丁香六月久久综合狠狠色| 不卡的av网站| 精品国产乱码久久久久久闺蜜| 中文字幕免费不卡| 九一九一国产精品| 欧美人伦禁忌dvd放荡欲情| 久久色在线观看| 男人的j进女人的j一区| 欧美制服丝袜第一页| 国产精品久久久久久久蜜臀| 久久精品国产免费看久久精品| 色婷婷综合久色| 亚洲丝袜另类动漫二区| 国产成人av一区二区三区在线观看| 欧美三级日韩在线| 亚洲高清不卡在线观看| 日本久久一区二区三区| 亚洲午夜精品在线| 在线观看成人小视频| 日本一区二区三级电影在线观看 | 色88888久久久久久影院野外| 国产丝袜欧美中文另类| 狠狠狠色丁香婷婷综合激情| 欧美不卡一二三| 国产成人午夜视频| 亚洲品质自拍视频| 日韩免费视频一区二区| 国产一区二区剧情av在线| 久久久综合精品| 成人综合婷婷国产精品久久蜜臀| 欧美精品一区男女天堂| 成人福利视频网站| 三级不卡在线观看| 国产午夜精品久久久久久久| av一二三不卡影片| 日本强好片久久久久久aaa| 久久久久久一级片| 欧美亚洲国产一区二区三区 | ...中文天堂在线一区| 欧美精品在线视频| 成人免费观看视频| 奇米色777欧美一区二区| 国产精品传媒视频| 精品国精品国产| 欧美色欧美亚洲另类二区| 国产麻豆精品在线| 蜜臀久久久99精品久久久久久| 国产精品嫩草久久久久| 日韩欧美中文字幕公布| 精品视频免费在线| 欧美三级电影在线看| 成人国产精品视频| 懂色av一区二区三区免费观看| 青娱乐精品在线视频| 亚洲成人中文在线| 午夜私人影院久久久久| 亚洲在线视频一区| 午夜电影一区二区| 五月婷婷综合激情| 日韩av中文在线观看| 日本sm残虐另类| 国内精品在线播放| www.一区二区| 91福利区一区二区三区| 欧美日韩亚洲国产综合| 精品国产乱码久久久久久夜甘婷婷| 欧美一区二区三区婷婷月色 | 国产精品白丝av| 一本高清dvd不卡在线观看 | 青青草国产精品亚洲专区无| 久久99精品久久久久久国产越南 | 亚洲欧洲av另类| 亚洲午夜在线电影| 国产成人精品免费看| 色久优优欧美色久优优| 欧美一区二区三区免费视频| 国产午夜精品久久| 亚洲6080在线| 播五月开心婷婷综合| 欧美日韩一区二区在线观看| 久久综合狠狠综合久久激情| 亚洲另类在线制服丝袜| 精品一区二区三区免费| 欧美日韩国产综合草草| 成人欧美一区二区三区小说| 免播放器亚洲一区| 91成人免费在线视频| 国产欧美综合色| 国产又黄又大久久| 日韩精品专区在线影院观看| 亚洲成人av一区二区| 99精品国产视频| 亚洲视频在线观看三级| 91女人视频在线观看| 国产精品麻豆99久久久久久| 国产成人在线看| 国产精品久久二区二区| caoporen国产精品视频| 自拍偷拍欧美激情| 91麻豆福利精品推荐| 亚洲精品乱码久久久久久黑人| 香蕉加勒比综合久久| 欧美美女一区二区三区| 日产国产高清一区二区三区| 69久久99精品久久久久婷婷| 美女性感视频久久| 中文字幕在线不卡一区| 一本久久综合亚洲鲁鲁五月天| 亚洲一区二区三区小说| 91麻豆精品国产91久久久久久| 麻豆91精品91久久久的内涵| 久久综合色8888| 不卡的电影网站| 蜜臀99久久精品久久久久久软件| 久久免费午夜影院| 欧美日韩1234| 99久久精品费精品国产一区二区 | 欧美大片顶级少妇| 91在线视频18| 国产精品一区二区果冻传媒| 天天色综合天天| 中文字幕高清一区| 久久天天做天天爱综合色| 9191精品国产综合久久久久久| 不卡免费追剧大全电视剧网站| 奇米精品一区二区三区在线观看 | 国产91丝袜在线观看| 六月丁香婷婷久久| 天天做天天摸天天爽国产一区| 国产精品久久久久影院色老大| 欧美变态口味重另类| 欧美一区二区免费观在线| 欧美日韩国产综合一区二区| 色婷婷国产精品综合在线观看| 成人午夜大片免费观看| 国产又黄又大久久| 国产激情视频一区二区三区欧美 | 欧美一区二区三区四区在线观看 | 亚洲精品中文在线影院| 亚洲一区二区五区| 男女男精品网站|