#include <Windows.h>
#include <Commdlg.h>
//先声明一下消息处理函数
LRESULT CALLBACK MyWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
//重新设定windows窗口客户区域大小
void ResetClientSize(HWND hWnd,int width, int height)
{
RECT rectProgram,rectClient;
GetWindowRect(hWnd,&rectProgram);
GetClientRect(hWnd,&rectClient);
int nWidth = rectProgram.right -rectProgram.left - (rectClient.right -rectClient.left);
int nHeiht = rectProgram.bottom -rectProgram.top - (rectClient.bottom -rectClient.top);
nWidth += width;
nHeiht += height;
rectProgram.right = nWidth;
rectProgram.bottom= nHeiht;
int showToScreenx =GetSystemMetrics(SM_CXSCREEN)/2-nWidth/2;
int showToScreeny =GetSystemMetrics(SM_CYSCREEN)/2-nHeiht/2;
MoveWindow(hWnd, showToScreenx,showToScreeny, rectProgram.right, rectProgram.bottom, false);
InvalidateRect(hWnd,NULL,TRUE);
}
// 入口点
int CALLBACK WinMain(
HINSTANCE hInstance,
HINSTANCE hPrvInstance,
LPSTR lpCommandLine,
int cmdShow)
{
char* clsName = "MyApp";
WNDCLASS wc;
ZeroMemory(&wc,sizeof(WNDCLASS));
wc.hInstance = hInstance;
wc.lpszClassName = clsName;
wc.lpfnWndProc = MyWindowProc;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wc);
HWND hMainwind = CreateWindow(clsName,"显示BMP图片",WS_OVERLAPPEDWINDOW,
300,200,100,100,NULL,NULL,hInstance,NULL);
if(hMainwind == NULL)
return 0;
OPENFILENAME ofn;
char szFile[MAX_PATH];
ZeroMemory(&ofn,sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = TEXT('\0');
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter= TEXT("bmp\0*.bmp\0");
ofn.nFilterIndex = 0;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle=TEXT("请选择一个BMP文件");
ofn.hwndOwner = hMainwind;
ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (GetOpenFileName(&ofn))
{
HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, szFile, IMAGE_BITMAP,
0, 0, LR_LOADFROMFILE);
BITMAP bmp;
ZeroMemory(&bmp,sizeof(bmp));
GetObject(hBitmap, sizeof(BITMAP), &bmp);
ResetClientSize(hMainwind,bmp.bmWidth,bmp.bmHeight);
ShowWindow(hMainwind,SW_NORMAL);
UpdateWindow(hMainwind);
MSG msg;
GetMessage(&msg,NULL,0,0);
while(msg.message != WM_QUIT)
{
if(PeekMessage( &msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
HDC hDC = GetDC(hMainwind);
HBRUSH hBrush = CreatePatternBrush(hBitmap);
HBRUSH hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);
Rectangle(hDC, 0, 0, bmp.bmWidth,bmp.bmHeight);
SelectObject(hDC, hOldBrush);
DeleteObject(hOldBrush);
ReleaseDC(hMainwind,hDC);
}
}
DeleteObject(hBitmap);
}
return 0;
}
LRESULT CALLBACK MyWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);//退出程序
return 0;
default:
break;
}
return DefWindowProc(hwnd,msg,wParam,lParam);
}