我在我的应用程序中使用Win32 API C ++属性表,并且与主标题或应用程序中的其他图标相比,页眉中使用的图标质量较低。
http://i.imgur.com/goiF7Je.png
在附加图像上,两个房屋图标都来自同一资源。
有没有办法将其更改为32位彩色图标?
const int Sheets = 2;
PROPSHEETPAGE psp[Sheets];
for (int i=0; i<Sheets; ++i)
{
psp[i].dwSize = sizeof(PROPSHEETPAGE);
psp[i].dwFlags = PSP_USEICONID | PSP_USETITLE;
psp[i].lParam = 0;
psp[i].pfnCallback = NULL;
psp[i].hInstance = m_hInst;
}
psp[0].pszTemplate = MAKEINTRESOURCE(IDDNEW_IS0);
psp[0].pszIcon = MAKEINTRESOURCE(IDI_GENERAL_TAB);
psp[0].pfnDlgProc = IntegrationServer::tabGeneral;
psp[0].pszTitle = "General";
psp[1].pszTemplate = MAKEINTRESOURCE(IDDNEW_IS1);
psp[1].pszIcon = MAKEINTRESOURCE(IDI_GENERAL_REQUESTS);
psp[1].pfnDlgProc = IntegrationServer::tabRequests;
psp[1].pszTitle = "Requests";
PROPSHEETHEADER psh;
psh.dwSize = sizeof(PROPSHEETHEADER);
psh.dwFlags = PSH_USEICONID | PSH_PROPSHEETPAGE | PSH_NOCONTEXTHELP | PSH_NOAPPLYNOW;
psh.hInstance = m_hInst;
psh.pszIcon = MAKEINTRESOURCE(IDI_GENERAL_TAB);
psh.pszCaption = (LPSTR) "Integration Server configuration";
psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
psh.nStartPage = 0;
psh.ppsp = (LPCPROPSHEETPAGE) &psp;
psh.hwndParent = m_hWnd;
PropertySheet(&psh);
答案 0 :(得分:1)
最后,我找到了解决上述问题的方法。我使用Tab Control创建了类似的窗口,而不是Property Sheets。
使用标签控制的好处:
缺陷:
这是一个示例窗口: http://i.imgur.com/4AcXvSz.png
源代码:
/*
Need this:
#include <commctrl.h >
#pragma comment(lib, "Comctl32.lib")
#pragma comment(linker,"/manifestdependency:\"type='win32' "
"name='Microsoft.Windows.Common-Controls' version='6.0.0.0' "
"processorArchitecture='*' publicKeyToken='6595b64144ccf1df' "
"language='*'\"")
*/
// get HWND of Tab Control
HWND tab = GetDlgItem(hDlg, IDC_TAB1);
// get current instance
HINSTANCE hInst = (HINSTANCE) GetModuleHandle(NULL);
// insert 7 tabs in our Tab Control
TCITEM tie;
tie.mask = TCIF_TEXT | TCIF_IMAGE;
LPSTR item[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
for (int i = 0; i < 7; i++)
{
tie.pszText = item[i];
tie.iImage = i;
if (TabCtrl_InsertItem(tab, i, &tie) == -1)
break;
}
// insert 7 icons for each Tab
HIMAGELIST hi = ImageList_Create(16, 16, ILC_COLOR32, 0, 7);
if (hi != NULL)
{
int icons[] = {IDI_ACTIONADD, IDI_ACTIONDELETE, IDI_ACTIONEDIT,
IDI_ACTIONIMPORT, IDI_ACTIONVIEW, IDI_CONFIGURATION,
IDI_CONF_CLEANUP};
for (int i =0; i<7; ++i)
{
HICON icon = (HICON) LoadImage(hInst, MAKEINTRESOURCE(icons[i]), IMAGE_ICON, 16, 16, 0);
ICONINFO iconinfo;
GetIconInfo(icon, &iconinfo);
HBITMAP bitmap = iconinfo.hbmColor;
ImageList_Add(hi, bitmap, NULL);
DestroyIcon(icon);
}
}
TabCtrl_SetImageList(tab, hi);
// Set position and size of child window to
// put it on the entire surface of tab display window
RECT rect;
GetClientRect(tab, &rect);
// This will collect entire Tab window and will return rectangle, which will
// fulfill display space
TabCtrl_AdjustRect(tab, FALSE, &rect);
// Create child window, which will be inserted into Tab display space
HWND child = CreateDialog(hInst, MAKEINTRESOURCE(IDD_IS_COMMON_CLEANUP),
tab, IntegrationServer::empty);
// Set child window position and size to fulfill Tab Control
// those "-2", "-1" etc. are just for me - I don't like white space :)
SetWindowPos(child, NULL,
rect.left-2, rect.top-1, rect.right-rect.left+2, rect.bottom-rect.top+2,
SWP_NOZORDER);
// Show child window
ShowWindow(child, SW_SHOW);
之后,当用户要更改当前显示的选项卡并将新HWND加载到Tab Control的显示空间时,您必须查找选项卡控件通知。
Tab Control的通知可在此处找到: http://msdn.microsoft.com/en-us/library/windows/desktop/bb760548(v=vs.85).aspx