|   一派掌門 二十級 | 
              【C++代码】#include <tchar.h>
 #include <Windows.h>
 #include <CommCtrl.h>
 #include <gdiplus.h>
 #include <winhttp.h>
 #include "resource.h" // 资源头文件
 
 // 启用XP风格
 #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='*'\"")
 
 #pragma comment(lib, "gdiplus.lib")
 #pragma comment(lib, "winhttp.lib")
 using namespace Gdiplus;
 
 HBITMAP hbmp; // 位图句柄
 TCHAR szBmpText[30]; // 提示框的内容
 
 // 加载图像
 void LoadPicture(void)
 {
 // 连接服务器
 HINTERNET hSession = WinHttpOpen(L"My Test", NULL, NULL, NULL, NULL);
 HINTERNET hConnect = WinHttpConnect(hSession, L"zh.arslanbar.net", INTERNET_DEFAULT_HTTP_PORT, NULL);
 HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", L"Files/TopicImages/2012-7/8_2012-7-13_121400_609-318482.jpg", NULL, NULL, NULL, WINHTTP_FLAG_REFRESH);
 WinHttpSendRequest(hRequest, NULL, NULL, NULL, NULL, NULL, NULL);
 WinHttpReceiveResponse(hRequest, NULL);
 
 // 下载图像到内存中
 HGLOBAL hMem = NULL;
 char *content = NULL;
 DWORD dwSize;
 DWORD dwRead = 0;
 DWORD dwBufSize = 0;
 while (WinHttpQueryDataAvailable(hRequest, &dwSize), dwSize > 0)
 {
 if (hMem == NULL)
 hMem = GlobalAlloc(GMEM_MOVEABLE, dwSize);
 else
 hMem = GlobalReAlloc(hMem, dwBufSize + dwSize, GMEM_MOVEABLE);
 content = (char *)GlobalLock(hMem);
 WinHttpReadData(hRequest, content + dwBufSize, dwSize, &dwRead);
 GlobalUnlock(hMem);
 dwBufSize += dwSize;
 }
 WinHttpCloseHandle(hRequest);
 WinHttpCloseHandle(hConnect);
 WinHttpCloseHandle(hSession);
 
 // 转换为Stream对象并创建位图对象
 IStream *is;
 CreateStreamOnHGlobal(hMem, TRUE, &is);
 Bitmap bmp(is);
 is->Release();
 
 // 获得位图句柄
 bmp.GetHBITMAP(Color::White, &hbmp);
 _stprintf_s(szBmpText, TEXT("Size: %ux%u"), bmp.GetWidth(), bmp.GetHeight());
 }
 
 // 创建提示框
 void CreateTooltip(HWND hDlg)
 {
 HINSTANCE hInst = (HINSTANCE)GetWindowLongPtr(hDlg, GWLP_HINSTANCE);
 HWND hwndTip = CreateWindow(TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_ALWAYSTIP, 0, 0, 0, 0, hDlg, NULL, hInst, NULL);
 
 TOOLINFO ti;
 ZeroMemory(&ti, sizeof(ti));
 ti.cbSize = sizeof(TOOLINFO);
 ti.hwnd = hDlg;
 ti.hinst = hInst;
 ti.lpszText = szBmpText;
 ti.uFlags = TTF_SUBCLASS;
 
 // 获取图像控件相对于对话框的矩形区域
 POINT pt;
 HWND hwndStatic = GetDlgItem(hDlg, IDC_BMP);
 GetWindowRect(hwndStatic, &ti.rect);
 pt.x = ti.rect.left;
 pt.y = ti.rect.top;
 ScreenToClient(hDlg, &pt);
 GetClientRect(hwndStatic, &ti.rect);
 OffsetRect(&ti.rect, pt.x, pt.y);
 
 SendMessage(hwndTip, TTM_ADDTOOL, NULL, (LPARAM)&ti);
 }
 
 INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
 int wmId;
 switch (uMsg)
 {
 case WM_INITDIALOG:
 SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(NULL, IDI_APPLICATION)); // 设置对话框图标
 LoadPicture(); // 当对话框创建时加载图像
 SendDlgItemMessage(hDlg, IDC_BMP, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hbmp);
 CreateTooltip(hDlg);
 break;
 case WM_COMMAND:
 wmId = LOWORD(wParam);
 switch (wmId)
 {
 case IDOK:
 case IDCANCEL:
 DestroyWindow(hDlg);
 break;
 }
 break;
 case WM_DESTROY:
 DeleteObject(hbmp); // 当对话框关闭时删除位图句柄
 PostQuitMessage(0); // 退出消息循环
 break;
 }
 return FALSE;
 }
 
 int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
 {
 // 初始化GDI+
 GdiplusStartupInput gdiplusStartupInput;
 ULONG_PTR gdiplusToken;
 GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
 
 // 创建并显示对话框
 HWND hDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
 ShowWindow(hDlg, nCmdShow);
 
 // 消息循环
 MSG msg;
 while (GetMessage(&msg, NULL, 0, 0))
 {
 TranslateMessage(&msg);
 DispatchMessage(&msg);
 }
 
 GdiplusShutdown(gdiplusToken);
 return msg.wParam;
 }
 
 |