我建立的WIN32工程画图文件...只能指定路径打开文件..能不能随意打开(好象WIN系统里一样有弹出对话框)
同学说用OPENFILENAME 函数完成....貌似我看不懂MSDN
请能帮忙的人帮帮忙哦
以下是我的程序主要部分(菜单需要连接一下呢):
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance;
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
static POINT start,finish;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
//HPEN newpen,oldpen;
static bool BUTTONDOWN;
static int drawstyle=1;//1ZHIXIAN,2QUXIAN 3JUXING 4TUOYUAN
static HBRUSH brush;
static CHOOSECOLOR color;
static COLORREF pencolor=RGB(0,0,0),brushcolor=RGB(255,255,255);;//TIANCHONG
static LOGBRUSH lb;
static HPEN newpen,oldpen;
static int penstyle=PS_SOLID;
//BITMAP bitmap;
static HDC hdcmem;
static HBITMAP hbitmap;
static int cxbitmap,cybitmap;
static int cxClient,cyClient;
static OPENFILENAME ofn;
BITMAP bitmap;
HANDLE hfile;
BYTE *bits,*bitmapdate;
DWORD filesize,size;
BITMAPFILEHEADER *bitmapfileheader,bitmapheader;
BITMAPINFOHEADER *bitmapinfodeader;
BITMAPINFO *bitmapinfo;
unsigned long bitmapsize,length;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case ID_ZHIXIAN:
drawstyle=1;
break;
case ID_QUXIAN:
drawstyle=2;
break;
case ID_JUXING:
drawstyle=3;
break;
case ID_TUOYUAN:
drawstyle=4;
break;
case ID_SHIXIAN:
penstyle=PS_SOLID;
break;
case ID_XUXIAN:
penstyle=PS_DASH;
break;
case ID_DIANXIAN:
penstyle=PS_DASHDOT;
break;
case ID_COLOR:
//color.rgbResult=ref;
if(ChooseColor(&color))
pencolor=color.rgbResult;
break;
case ID_BRUSHCOLOR:
if(ChooseColor(&color))
brushcolor=color.rgbResult;
break;
case ID_OPEN:
hdc=GetDC(hWnd);
hdcmem=CreateCompatibleDC(hdc);
hfile=CreateFile("D:\\",GENERIC_READ,FILE_SHARE_READ,
(LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL);
if(!hfile) return FALSE;
filesize=GetFileSize(hfile,&size);
bits=(BYTE *)malloc(filesize);
if(!bits) return FALSE;
if(!ReadFile(hfile,bits,filesize,&filesize,NULL)) return FALSE;
bitmapfileheader=(BITMAPFILEHEADER *)bits;
bitmapinfodeader=(BITMAPINFOHEADER *)(bitmapfileheader+1);
bitmapinfo=(BITMAPINFO *)(bitmapfileheader+1);
bitmapdate=bits+bitmapfileheader->bfOffBits;
hbitmap=CreateDIBitmap(hdc,bitmapinfodeader,CBM_INIT,
bitmapdate,bitmapinfo,DIB_RGB_COLORS);
hdc=GetDC(hWnd);
hdcmem=CreateCompatibleDC(hdc);
hfile=CreateFile("D:\\",GENERIC_READ,FILE_SHARE_READ,
(LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL);
if(!hfile) return FALSE;
filesize=GetFileSize(hfile,&size);
bits=(BYTE *)malloc(filesize);
if(!bits) return FALSE;
if(!ReadFile(hfile,bits,filesize,&filesize,NULL)) return FALSE;
bitmapfileheader=(BITMAPFILEHEADER *)bits;
bitmapinfodeader=(BITMAPINFOHEADER *)(bitmapfileheader+1);
bitmapinfo=(BITMAPINFO *)(bitmapfileheader+1);
bitmapdate=bits+bitmapfileheader->bfOffBits;
hbitmap=CreateDIBitmap(hdc,bitmapinfodeader,CBM_INIT,
bitmapdate,bitmapinfo,DIB_RGB_COLORS);
free(bits);
InvalidateRect(hWnd,NULL,true);
break;
case ID_SAVE:
hdc=GetDC(hWnd);
hdcmem=CreateCompatibleDC(hdc);
GetObject(hbitmap,sizeof(BITMAP),(LPSTR)&bitmap);
bitmapinfo=(BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER));
hfile=CreateFile("D:\\1.bmp",GENERIC_READ|GENERIC_WRITE,(DWORD)0,
(LPSECURITY_ATTRIBUTES)NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL);
if(!hfile) return FALSE;
bitmapinfodeader=(BITMAPINFOHEADER *)bitmapinfo;
bitmapinfodeader->biBitCount=bitmap.bmBitsPixel;
bitmapinfodeader->biHeight=bitmap.bmHeight;
bitmapinfodeader->biWidth=bitmap.bmWidth;
bitmapinfodeader->biPlanes=bitmap.bmPlanes;
bitmapinfodeader->biClrUsed=0;
bitmapinfodeader->biClrImportant=0;
bitmapinfodeader->biCompression=BI_RGB;
bitmapinfodeader->biSizeImage=0;
bitmapinfodeader->biXPelsPerMeter=0;
bitmapinfodeader->biYPelsPerMeter=0;
bitmapinfodeader->biSize=sizeof(BITMAPINFOHEADER);
bitmapheader.bfType=0x4d42;
bitmapheader.bfReserved1=0;
bitmapheader.bfReserved2=0;
bitmapheader.bfOffBits=(DWORD)sizeof(BITMAPINFOHEADER)+(DWORD)sizeof(BITMAPFILEHEADER);
bitmapsize=bitmap.bmWidthBytes*bitmapinfodeader->biHeight*bitmap.bmPlanes;
bitmapheader.bfSize=(DWORD)sizeof(BITMAPINFOHEADER)+(DWORD)sizeof(BITMAPFILEHEADER)+bitmapsize;
bits=(BYTE *)malloc(bitmapsize);
if(!GetDIBits(hdc,hbitmap,0,(WORD)bitmap.bmHeight,bits,bitmapinfo,DIB_RGB_COLORS==ERROR_INVALID_PARAMETER)) return FALSE;
WriteFile(hfile,&bitmapheader,sizeof(BITMAPFILEHEADER),&length,NULL);
WriteFile(hfile,bitmapinfodeader,sizeof(BITMAPINFOHEADER),&length,NULL);
WriteFile(hfile,bits,bitmapsize,&length,NULL);
CloseHandle(hfile);
free(bits);
free(bitmapinfo);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);
break;
case WM_CREATE:
hdc=GetDC(hWnd);
cxbitmap=GetSystemMetrics(SM_CXMAXIMIZED);
cybitmap=GetSystemMetrics(SM_CYMAXIMIZED);
hdcmem=CreateCompatibleDC(hdc);
hbitmap=CreateCompatibleBitmap(hdc,cxbitmap,cybitmap);
SelectObject(hdcmem,hbitmap);
PatBlt(hdcmem,0,0,cxbitmap,cybitmap,WHITENESS);
color.hwndOwner=hWnd;
color.lStructSize=sizeof(color);
color.Flags=CC_ANYCOLOR|CC_RGBINIT;
color.lpCustColors=&lb.lbColor;
lb.lbColor=RGB(0,0,0);
lb.lbHatch=0;
lb.lbStyle=0;
BUTTONDOWN=FALSE;
break;
case WM_LBUTTONDOWN:
start.x=LOWORD(lParam);
start.y=HIWORD(lParam);
finish.x=start.x;
finish.y=start.y;
BUTTONDOWN=TRUE;
break;
case WM_LBUTTONUP:
BUTTONDOWN=FALSE;
break;
case WM_MOUSEMOVE:
if(BUTTONDOWN)
{
switch(drawstyle){
case 1:
hdc=GetDC(hWnd);
SetROP2(hdc,R2_NOTXORPEN);
SetROP2(hdcmem,R2_NOTXORPEN);
newpen=CreatePen(penstyle,1,pencolor);
SelectObject(hdc,newpen);
oldpen=(HPEN)SelectObject(hdcmem,newpen);
MoveToEx(hdc,start.x,start.y,NULL);
MoveToEx(hdcmem,start.x,start.y,NULL);
LineTo(hdc,finish.x,finish.y);
LineTo(hdcmem,finish.x,finish.y);
//SelectObject(hdc,oldpen);
finish.x=LOWORD(lParam);
finish.y=HIWORD(lParam);
MoveToEx(hdc,start.x,start.y,NULL);
MoveToEx(hdcmem,start.x,start.y,NULL);
LineTo(hdc,finish.x,finish.y);
LineTo(hdcmem,finish.x,finish.y);
SetROP2(hdc,R2_COPYPEN);
SetROP2(hdcmem,R2_COPYPEN);
SelectObject(hdcmem,oldpen);
ReleaseDC(hWnd,hdc);
DeleteObject(newpen);
break;
case 2:
hdc=GetDC(hWnd);
newpen=CreatePen(penstyle,1,pencolor);
SelectObject(hdc,newpen);
oldpen=(HPEN)SelectObject(hdcmem,newpen);
finish.x=LOWORD(lParam);
finish.y=HIWORD(lParam);
MoveToEx(hdc,start.x,start.y,NULL);
MoveToEx(hdcmem,start.x,start.y,NULL);
LineTo(hdc,finish.x,finish.y);
LineTo(hdcmem,finish.x,finish.y);
start.x=finish.x;
start.y=finish.y;
SelectObject(hdcmem,oldpen);
ReleaseDC(hWnd,hdc);
DeleteObject(newpen);
break;
case 3:
hdc=GetDC(hWnd);
SetROP2(hdc,R2_NOTXORPEN);
SetROP2(hdcmem,R2_NOTXORPEN);
newpen=CreatePen(penstyle,1,pencolor);
SelectObject(hdc,newpen);
oldpen=(HPEN)SelectObject(hdcmem,newpen);
brush=CreateSolidBrush(brushcolor);
SelectObject(hdc,brush);
SelectObject(hdcmem,brush);
Rectangle(hdc,start.x,start.y,finish.x,finish.y);
Rectangle(hdcmem,start.x,start.y,finish.x,finish.y);
finish.x=LOWORD(lParam);
finish.y=HIWORD(lParam);
Rectangle(hdc,start.x,start.y,finish.x,finish.y);
Rectangle(hdcmem,start.x,start.y,finish.x,finish.y);
SetROP2(hdc,R2_COPYPEN);
SetROP2(hdcmem,R2_COPYPEN);
ReleaseDC(hWnd,hdc);
DeleteObject(newpen);
break;
case 4:
hdc=GetDC(hWnd);
SetROP2(hdc,R2_NOTXORPEN);
SetROP2(hdcmem,R2_NOTXORPEN);
newpen=CreatePen(penstyle,1,pencolor);
SelectObject(hdc,newpen);
oldpen=(HPEN)SelectObject(hdcmem,newpen);
brush=CreateSolidBrush(brushcolor);
SelectObject(hdc,brush);
SelectObject(hdcmem,brush);
Ellipse(hdc,start.x,start.y,finish.x,finish.y);
Ellipse(hdcmem,start.x,start.y,finish.x,finish.y);
finish.x=LOWORD(lParam);
finish.y=HIWORD(lParam);
Ellipse(hdc,start.x,start.y,finish.x,finish.y);
Ellipse(hdcmem,start.x,start.y,finish.x,finish.y);
SetROP2(hdc,R2_COPYPEN);
SetROP2(hdcmem,R2_COPYPEN);
SelectObject(hdcmem,oldpen);
ReleaseDC(hWnd,hdc);
DeleteObject(newpen);
break;
}
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
//hbitmap=LoadBitmap(hInst,(LPCTSTR)IDB_BITMAP1);
SelectObject(hdcmem,hbitmap);
BitBlt(hdc,0,0,cxClient,cyClient,hdcmem,0,0,SRCCOPY);
RECT rt;
GetClientRect(hWnd, &rt);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}