为 WCHAR*类型,这使用我们使用前需要先转换一下: string wstring2string(const wstring& ws) { _bstr_t t = ws.c_str(); char* pchar = (char*)t; string result = pchar; return result; } 说说APK 文件图标的获取,在上面图6显示的信息中,就能够知道 APK图标的文件名与 位置,而这个文件存放在 APK 这个 ZIP 包中,AAPT 不提供 ZIP 解压的功能,需要自己来提 取APK中的文件,这里为了代码轻便使用了XUNZIP类,获取图标并解压的工作放到了void UnzipIcoFile(string outPath)方法中: void CAPKHelper::UnzipIcoFile( string outPath) { HZIP hZip = OpenZip((void*)(char*)m_apkName.c_str(), 0, ZIP_FILENAME); int index = -1; ZIPENTRY ze; ZRESULT bRet = FindZipItem(hZip, m_iconFile.c_str(), TRUE, &index, &ze); if (bRet == ZR_OK) { UnzipItem(hZip, index, (void*)outPath.c_str(), 0, ZIP_FILENAME); } CloseZip(hZip); } 在主程序中处理如下: char szBuffer[MAX_PATH] = {0}; GetTempPath(MAX_PATH, szBuffer); m_outpngPath = szBuffer; m_outpngPath += m_helper->PkgName(); m_outpngPath += m_helper->Version(); m_outpngPath += ".png"; //APK文件图标释放路径 m_helper->UnzipIcoFile(m_outpngPath.c_str()); ShowPNG(); //显示图标 最后调用 ShowPNG()来显示图标,一般 APK中的图标为PNG,在VC 中显示 PNG使用GDI+ 再方便不过了,代码如下: void CAPKInstallerDlg::ShowPNG() { if (!m_outpngPath.empty()) { wstring str = string2wstring(m_outpngPath); Image image(str.c_str()); RECT rc; m_stcPic.GetWindowRect(&rc); m_pGraphics->DrawImage(&image, 0, 0, rc.right-rc.left, rc.bottom-rc.top); } } 但是直接显示 PNG 后,程序如果被刷新图片就不再显示了,因此我们需要在 WM_PAINT 消息中做进一步的处理: void CAPKInstallerDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); CDialog::UpdateWindow(); ShowPNG(); } } 在调用 ShowPNG()之前,CDialog::UpdateWindow()这行代码一定要先加上,否则图标 照样不会显示,好了,整体上程序代码很简单,一目了然,到这里我们的程序就算是完成了, 看看运行效果如下图: ![]() |