谁有只有一个菜单的程序,该菜单点击后谈出一个对话框参考啊。
我的死活都是那个样,可以运行,对话框没反应。
,bmp也显示不了。。
怎么搞得。
我的程序有两个rc,一个是用vc做的,是对话框,另外一个是菜单和图片,
用文本编辑的。
程序铁出来给大家帮忙看看。图片可以任意3个,改成我的图片的名字就行了。
分别是:ship.bmp ,submarine.bmp ,about.bmp,Bitmap.bmpico和cur文件你的机上任意选一个改成我的文件名就行了。
 图标是:vc.ico  ,光标是:harrow.cur
main.cpp
main.h
resource.h
resource.rc 
dialog.rc
vc.ico//////////////////////////Main.cpp/////////////////////////////////////
///////////////////////////////////////////////////////////////////////
#define STRICT
#include <stdio.h>
#include <windows.h>
#include <windowsx.h>
#include <string.h>
#include "main.h"
static char appname[]="位图和对话框";
static HWND MainWindow;
static HINSTANCE hInstance;int MaxLines =21;
int Start =32;
int TextHeight;
int PageSize=10;
int nPosition=0;
BOOL DrawBitmaps=true;//==================================================================
//INITIALZATION
//==================================================================
int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
MSG msg;
 if(!hPrevInstance)
 if(!Register(hInstance))
 return FALSE;
 if(!(MainWindow=Create(hInstance,nShowCmd)))
     return FALSE;
 while (GetMessage(&msg,NULL,0,0))
 {
 TranslateMessage(&msg);
 DispatchMessage(&msg);
 }
 return msg.wParam;
}
BOOL Register(HINSTANCE hInstance)
{
WNDCLASS wndClass; wndClass.style = CS_HREDRAW|CS_VREDRAW;
wndClass.lpfnWndProc =(WNDPROC)WndProc;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.hInstance  =hInstance;
wndClass.hIcon      = LoadIcon(hInstance,"Icon");
wndClass.hCursor    = LoadCursor(hInstance,"HARROW");
wndClass.hbrBackground =GetStockBrush(WHITE_BRUSH);
wndClass.lpszMenuName = "MENU";
wndClass.lpszClassName =appname;   return RegisterClass(&wndClass);
}//=================================================================
//CREATE WINDOW
//=================================================================
HWND Create(HINSTANCE hInstance,int cmdShow)
{
HWND hWindow= CreateWindow(appname,appname,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
if(hWindow == NULL)
return hWindow;
    ShowWindow(hWindow,cmdShow);
UpdateWindow(hWindow); return hWindow;
}
//===================================================================
//Window Proc
//===================================================================
LRESULT   CALLBACK WndProc(HWND hWindow,UINT Message,
WPARAM wParam,LPARAM lParam)
{
  switch(Message)
  {
     HANDLE_MSG(hWindow,WM_DESTROY,Window_OnDestroy);
     HANDLE_MSG(hWindow,WM_COMMAND,Window_OnCommand);
 HANDLE_MSG(hWindow,WM_CREATE,Window_OnCreate);
 HANDLE_MSG(hWindow,WM_KEYDOWN,Window_OnKey);
 HANDLE_MSG(hWindow,WM_PAINT,Window_OnPaint);
 HANDLE_MSG(hWindow,WM_VSCROLL,Window_OnVScroll);     default: 
 return DefWindowProc(hWindow,Message,wParam,lParam); 
  
  }
}  //====================================================================
//Other
//====================================================================
void Window_OnDestroy(HWND hwnd)
{
DeleteBitmap(MyBitMap);
PostQuitMessage(0);}BOOL Window_OnCreate(HWND hWnd,CREATESTRUCT * lpCreateStruct) 
{
TEXTMETRIC textmetrics;
MyBitMap=LoadBitmap(hInstance,"Ship");
if(!MyBitMap)
{
MessageBox(hWnd,"No Bitmap","Fatal Error",MB_OK);
    //return false;
return true;
}
HDC PaintDC=GetDC(hWnd);
GetTextMetrics(PaintDC,&textmetrics);
ReleaseDC(hWnd,PaintDC); TextHeight=textmetrics.tmHeight+textmetrics.tmExternalLeading;
SetScrollRange(hWnd,SB_VERT,0,MaxLines-Start,false);
return true;
}//Message Handle
void Window_OnCommand(HWND hWnd,int id,HWND hwndCtl,UINT codeNotify) 
{
switch(id)
{
case CM_ABOUT:
{
FARPROC AboutBox= MakeProcInstance((FARPROC)AboutDlgProc,hInstance);
DialogBox(hInstance,"About",hWnd,(DLGPROC)AboutBox);
FreeProcInstance(AboutBox);
break;
}
 
case  CM_DRAWBITMAP :
Start=32;
MaxLines=22;
InvalidateRect(hWnd,NULL,true);
DrawBitmaps=false;
break;
case CM_SHIP :
Start=0;
MaxLines=32;
InvalidateRect(hWnd,NULL,true);
DrawBitmaps=false;
break;
    case CM_EXPLOSION  :
Start=50;
MaxLines=37;
InvalidateRect(hWnd,NULL,true);
DrawBitmaps=false;
break;
    case CM_SUBMARINE  :
 DrawBitmaps=true;
 InvalidateRect(hWnd,NULL,true);
break;
}

}
void Window_OnPaint(HWND hWnd) 
{
PAINTSTRUCT PaintStruct;
SIZE L;
int NumImages=15;
char S[101];
int Y=0;
HDC PaintDC=BeginPaint(hWnd,&PaintStruct);

if(DrawBitmaps)
{
HDC BitmapDC=CreateCompatibleDC(PaintDC);
HBITMAP OldBitmap=SelectBitmap(BitmapDC,MyBitMap);
for(int i=0;i<NumImages;i++)
for(int j=0;j<NumImages;j++)
BitBlt(PaintDC,i*66,j*66,64,65,BitmapDC,0,0,SRCCOPY);
SelectBitmap(BitmapDC,OldBitmap);
DeleteDC(BitmapDC);
}
else
{
HPEN APen=CreatePen(PS_NULL,0,0);
HPEN SavePen=SelectPen(PaintDC,APen);
for(int i=nPosition;i<MaxLines;i++)
{
LoadString(hInstance,i+Start,S,100);
TextOut(PaintDC,1,Y,S,strlen(S));
GetTextExtentPoint(PaintDC,S,strlen(S),&L);
if(L.cx==0)
Rectangle(PaintDC,1,Y,400,Y+1+TextHeight);
else 
Rectangle(PaintDC,L.cx,Y,L.cx+200,Y+1+TextHeight);
Y+=TextHeight;
}
Rectangle(PaintDC,1,Y,400,Y+1+400);
SelectPen(PaintDC,SavePen);
DeleteObject(APen);
}
EndPaint(hWnd,&PaintStruct);
 
}
void Window_OnKey(HWND hWnd,UINT vk,BOOL fDown,int cRepeat,UINT flags) 
{
  switch(vk)
  {  case VK_HOME:
  SendMessage(hWnd,WM_VSCROLL,SB_TOP,0L);
  break;
  case VK_DOWN:
    SendMessage(hWnd,WM_VSCROLL,SB_LINEDOWN,0L);
    break;
   case VK_UP:
    SendMessage(hWnd,WM_VSCROLL,SB_LINEUP,0L);
    break;   }
}
void Window_OnVScroll(HWND hWnd,HWND hwndCtl,UINT code,int pos)
{
  
}
 
//对话框的消息处理程序  
BOOL  AboutDlgProc(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,IDOK);
return true; }
break;
    default:
return false;
}
} ///////////////////////////////////main.h//////////////////////////////
#define CM_ABOUT 1101
#define CM_DRAWBITMAP 1102
#define CM_SHIP 1103
#define CM_EXPLOSION 1104
#define CM_SUBMARINE 1105
 //Macros
 
 
//Window and ProcLRESULT CALLBACK WndProc(HWND hWindow,UINT Message,WPARAM wparam,LPARAM lparam);
BOOL Register(HINSTANCE hInst);HWND Create(HINSTANCE hInstance,int cmdShow);
BOOL Window_OnCreate(HWND hWnd,CREATESTRUCT * lpCreateStruct);
BOOL AboutDlgProc(HWND hDlg,UINT Message,WPARAM wParam,LPARAM lParam);
//Message Handle
void Window_OnCommand(HWND hWnd,int id,HWND hwndCtl,UINT codeNotify);
void Window_OnPaint(HWND hWnd);
void Window_OnKey(HWND hWnd,UINT vk,BOOL fDown,int cRepeat,UINT);
void Window_OnDestroy(HWND hWnd);
void Window_OnVScroll(HWND hWnd,HWND hwndCtl,UINT code,int pos);//Variables
HBITMAP MyBitMap;
///这是第一份。剩下另外一份是资源文件

解决方案 »

  1.   

    //这是我原来的一段代码,你参考一下:
    int _MaxScreenX_ = 1024; //现在是示例,必要时通GetSystemMetrics取得
    int _MaxScreenY_ = 768;BOOL FAR PASCAL _export ABOUT(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
     static RECT rectW;
     HDC hdc;switch (message)
    {
     case WM_INITDIALOG:
    GetWindowRect(hDlg,&rectW);//取得整个窗口的外框尺寸
             SetWindowPos(hDlg,NULL,
                          (_MaxScreenX_-(rectW.right-rectW.left))/2,
                          (_MaxScreenY_-(rectW.bottom-rectW.top))/2,
                          0,0,SWP_NOSIZE);
    return (TRUE); case WM_PAINT:
             DefWindowProc(hDlg, message, wParam, lParam);
    hdc=GetDC(hDlg);
    GetClientRect(hDlg,&rectW);// ShowBMPFile(hdc,rectW,SB_COPY,"d:\\br4.bmp");
    ReleaseDC(hDlg,hdc);
             return 0; case WM_COMMAND:
    switch(GET_WM_COMMAND_ID(wParam, lParam))
    {
     case IDOK:
     case IDCANCEL:
    EndDialog(hDlg, TRUE);
    return (TRUE);
    }
    break;
      }
      return DefWindowProc(hDlg, message, wParam, lParam);
    }static DLGPROC  lpproc;
    lpproc = (DLGPROC)MakeProcInstance(ABOUT, hInst);
    DialogBox(hInst,"ABOUT_DLG",hWnd,lpproc);
    FreeProcInstance((FARPROC)lpproc);