呵呵,好久没用API了,都忘了!

解决方案 »

  1.   

    // CRMENU.C
    // Stefano Maruzzi 1996// LIST06-04
    // CreateMenu()
        
    #include <windows.h>
    #include "resource.h"// definitions and macros
    #define MARGIN 10
    #define BORDERWIDTH 5
    // function prototypes
    HMENU MakeTheMenu( HWND hwnd, HINSTANCE hInstance) ;
    LRESULT WINAPI ClientWndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) ;int WINAPI WinMain( HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpszCmdLine,
    int nCmdShow)
    {
    HWND hwnd ;
    MSG msg ;
    char szClassName[ 20] ;
    char szWindowTitle[ 25] ;
    WNDCLASSEX wc ; // loading the class name
    LoadString( hInstance, ST_CLASSNAME, szClassName, sizeof( szClassName)) ;
    // loading the window title
    LoadString( hInstance, ST_WINDOWTITLE, szWindowTitle, sizeof( szWindowTitle)) ; wc.cbSize = sizeof( wc) ;
    wc.style = CS_VREDRAW | CS_HREDRAW ;
    wc.lpfnWndProc = ClientWndProc ;
    wc.cbClsExtra = 0 ;
    wc.cbWndExtra = 0 ;
    wc.hInstance = hInstance ;
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION) ;
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION) ;
    wc.hCursor = LoadCursor( NULL, IDC_ARROW) ;
    wc.hbrBackground = GetStockObject( WHITE_BRUSH) ;
    wc.lpszMenuName = NULL ;
    wc.lpszClassName = szClassName ; if( !RegisterClassEx( &wc))
    {
    MessageBeep( 0) ;
    return FALSE ;
    } hwnd = CreateWindowEx( WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE,
    szClassName,
    szWindowTitle,
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, 0,
    CW_USEDEFAULT, 0,
    NULL,
    NULL,
    hInstance,
    NULL) ; ShowWindow( hwnd, SW_SHOWNORMAL) ;
    // message loop
    while( GetMessage( &msg, NULL, 0, 0))
    {
    TranslateMessage( &msg) ;
    DispatchMessage( &msg) ;
    } return FALSE ;
    }LRESULT WINAPI ClientWndProc( HWND hwnd,
    UINT msg,
    WPARAM wParam,
    LPARAM lParam)
    {
    // last two colors
    static WORD wBorder = CL_BLACK ;
    static WORD wInside = CL_WHITE ; static HANDLE hInstance ;
    static COLORREF aColors[] = {
                                   RGB(0xFF, 0xFF, 0xFF), // white
                                   RGB(0x00, 0x00, 0x00), // black
                                   RGB(0x00, 0x00, 0xFF), // blue
                                   RGB(0xFF, 0x00, 0x00), // red
                                   RGB(0xFF, 0x00, 0xFF), // purple
                                   RGB(0xFF, 0xFF, 0x00), // yellow
                                   -1L                    // invalid color
                                   };
    switch( msg)
    {
    case WM_COMMAND:
    switch( LOWORD( wParam))
    {
    case MN_EXIT:
    PostQuitMessage( 0) ;
    break ; case MN_BLUEBORDER:
    case MN_REDBORDER:
    case MN_BLACKBORDER:
    case MN_WHITEBORDER:
    case MN_PURPLEBORDER:
    case MN_YELLOWBORDER:
    case MN_NOBORDER:
    wBorder = LOWORD( wParam) - MN_BORDER ;
    InvalidateRect( hwnd, NULL, TRUE) ;
    break ; case MN_WHITEINSIDE:
    case MN_BLACKINSIDE:
    case MN_BLUEINSIDE:
    case MN_REDINSIDE:
    case MN_PURPLEINSIDE:
    case MN_YELLOWINSIDE:
    case MN_NOINSIDE:
    wInside = LOWORD( wParam) - MN_INSIDE ;
    InvalidateRect (hwnd, NULL, TRUE) ;
    break; default:
    break ;
    }
    break ; case WM_CREATE:
    {
    hInstance = ((LPCREATESTRUCT)lParam) -> hInstance ; // creating the menu
    MakeTheMenu( hwnd, hInstance) ;
    }
    break ; case WM_CLOSE:
    PostQuitMessage( 0) ;
    break ; case WM_PAINT:
    {
    HBRUSH hbr, hbrOld ;
    HPEN hpen, hpenOld ;
    RECT rc ;
    HDC hdc;
    PAINTSTRUCT ps ; hdc = BeginPaint( hwnd, &ps) ; hpen = CreatePen( PS_SOLID, BORDERWIDTH, aColors[wBorder]);
    hbr = CreateSolidBrush( aColors[ wInside]) ; hbrOld = SelectObject( hdc, hbr) ;
    hpenOld = SelectObject( hdc, hpen) ;
    GetClientRect( hwnd, &rc) ;
    InflateRect( &rc, - MARGIN, - MARGIN) ;
    Rectangle( hdc, rc.left, rc.top, rc.right, rc.bottom) ; // background is transparent
    SetBkMode( hdc, TRANSPARENT) ; // delete all the objects
    SelectObject( hdc, hpenOld) ;
    SelectObject( hdc, hbrOld) ;
    DeleteObject( hbr) ;
    DeleteObject( hpen) ; EndPaint (hwnd, &ps);
    }
    break ; default:
    break ;
          }
       return DefWindowProc( hwnd, msg, wParam, lParam) ;
    }           HMENU MakeTheMenu( HWND hwnd, HINSTANCE hInstance)
    {
    HMENU hmenu, hmenuColors, hmenuBorder, hmenuInside, hmenuFile ;
    int i ;
    CHAR szItem[ 100] ;
    // main menu
    hmenu = CreateMenu() ; // border menu
    hmenuBorder = CreateMenu() ; // loading the strings
    i = MN_BORDER ;
    while( LoadString( hInstance, i, szItem, sizeof( szItem)))
    {
    AppendMenu( hmenuBorder, 0, i, szItem) ;
    i++ ;
    } // interior menu
    hmenuInside = CreateMenu() ; // loading the strings
    i = MN_INSIDE ;
    while( LoadString( hInstance, i, szItem, sizeof( szItem)))
    {
    AppendMenu( hmenuInside, 0, i, szItem) ;
    i++ ;
    } //  File menu
    hmenuFile = CreateMenu() ; i = MN_FILE ;
    while( LoadString( hInstance, i, szItem, sizeof( szItem)))
    {
    AppendMenu( hmenuFile, 0, i, szItem) ;
    i++ ;
    } //  Colors menu
    hmenuColors = CreateMenu() ; AppendMenu( hmenuColors, MF_POPUP, (UINT)hmenuBorder, "&Border") ;
    AppendMenu( hmenuColors, MF_POPUP, (UINT)hmenuInside, "&Inside") ; // 2 top-level
    AppendMenu( hmenu, MF_POPUP, (UINT)hmenuFile, "&File") ;
    AppendMenu( hmenu, MF_POPUP, (UINT)hmenuColors, "&Colors") ;    // associate the menu
        SetMenu( hwnd, hmenu) ;
    return hmenu ;
    }
      

  2.   

    //resource.h
    //{{NO_DEPENDENCIES}}
    // Microsoft Visual C++ generated include file.
    // Used by CRMENU.RC
    //
    #define ST_CLASSNAME                    1000
    #define ST_WINDOWTITLE                  1001// Next default values for new objects
    // definizioni menu File
    #define  MN_FILE 100
    #define  MN_EXIT MN_FILE + 0
    // definizioni colori e menuitemID associati
    #define  CL_WHITE     0
    #define  CL_BLACK     1
    #define  CL_BLUE      2
    #define  CL_RED       3
    #define  CL_PURPLE    4
    #define  CL_YELLOW    5
    #define  CL_LAST      5
    #define  CL_NONE      6#define  MN_INSIDE          300
    #define  MN_WHITEINSIDE     (MN_INSIDE + CL_WHITE)
    #define  MN_BLACKINSIDE     (MN_INSIDE + CL_BLACK)
    #define  MN_BLUEINSIDE      (MN_INSIDE + CL_BLUE)
    #define  MN_REDINSIDE       (MN_INSIDE + CL_RED)
    #define  MN_PURPLEINSIDE    (MN_INSIDE + CL_PURPLE)
    #define  MN_YELLOWINSIDE    (MN_INSIDE + CL_YELLOW)
    #define  MN_LASTINSIDE      (MN_INSIDE + CL_LAST)
    #define  MN_NOINSIDE (MN_INSIDE + CL_NONE)#define  MN_BORDER           400
    #define  MN_WHITEBORDER      (MN_BORDER + CL_WHITE)
    #define  MN_BLACKBORDER      (MN_BORDER + CL_BLACK)
    #define  MN_BLUEBORDER       (MN_BORDER + CL_BLUE)
    #define  MN_REDBORDER        (MN_BORDER + CL_RED)
    #define  MN_PURPLEBORDER     (MN_BORDER + CL_PURPLE)
    #define  MN_YELLOWBORDER     (MN_BORDER + CL_YELLOW)
    #define  MN_LASTBORDER       (MN_BORDER + CL_LAST)
    #define  MN_NOBORDER         (MN_BORDER + CL_NONE)
      

  3.   

    //Microsoft Visual C++ generated resource script.
    //
    #include "resource.h"/////////////////////////////////////////////////////////////////////////////
    //
    // String Table
    //STRINGTABLE DISCARDABLE 
    BEGIN
        MN_WHITEBORDER          "&White"
        MN_BLACKBORDER          "Blac&k"
        MN_BLUEBORDER           "&Blue"
        MN_REDBORDER            "&Red"
        MN_PURPLEBORDER         "&Purple"
        MN_YELLOWBORDER         "&Yellow"
        MN_NOBORDER             "&None"
        ST_CLASSNAME            "CRMENU"
        ST_WINDOWTITLE          "CreateMenu()"
    ENDSTRINGTABLE DISCARDABLE 
    BEGIN
        MN_WHITEINSIDE          "&White"
        MN_BLACKINSIDE          "Blac&k"
        MN_BLUEINSIDE           "&Blue"
        MN_REDINSIDE            "&Red"
    ENDSTRINGTABLE DISCARDABLE 
    BEGIN
        MN_PURPLEINSIDE         "&Purple"
        MN_YELLOWINSIDE         "&Yellow"
        MN_NOINSIDE             "&None"
    ENDSTRINGTABLE DISCARDABLE 
    BEGIN
        MN_EXIT                 "E&xit"
    END
      

  4.   

    唉,弄好了,谢谢,我不知道怎么给你加分,我输入密码也没用,好奇怪啊。
    **********************************************************************
    #include<windows.h>/*有菜单的例子*/
    #define ID_EXIT 1LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam); 
     
    int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nShowCmd){ 
    WNDCLASS wndclass; 
    if(!hPrevInstance){ 
    wndclass.cbClsExtra =0; 
    wndclass.cbWndExtra =0; 
    wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH); 
    wndclass.hCursor =0; 
    wndclass.hIcon =0; 
    wndclass.hInstance =hInstance; 
    wndclass.lpfnWndProc = WndProc; 
    wndclass.lpszClassName ="kdf"; 
    wndclass.lpszMenuName = "kdf menu"; 
    wndclass.style =0; 

     
    if(!RegisterClass(&wndclass)) return 0; //
    HMENU hMenu=CreateMenu(); 
    HMENU hSubMenu=CreateMenu();
    AppendMenu(hSubMenu,MF_STRING,ID_EXIT,"E&xit");
    AppendMenu(hMenu,MF_STRING|MF_POPUP,(UINT)hSubMenu,"&File");
    //
    HWND hWnd = CreateWindow(wndclass.lpszClassName ,"柯登峰欢迎你", WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 
             CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, NULL,hMenu,hInstance,NULL); 
     
    if(!hWnd) return 0;  ShowWindow(hWnd,nShowCmd); 
    UpdateWindow(hWnd); 
     
    MSG msg; 
    while(GetMessage(&msg,NULL,0,0)){ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
    }  DestroyMenu(hMenu); 
    DestroyMenu(hSubMenu);
    return msg.wParam ; 

     
    LRESULT CALLBACK WndProc(HWND hWndProc,UINT msg,WPARAM wParam,LPARAM lParam){ 
    switch (msg){ 
    //
    case WM_COMMAND: 
    switch(LOWORD(wParam)) 

    case ID_EXIT: 
    PostMessage(hWndProc,WM_CLOSE,0,0); 
    break;

           break; 
    //
    case WM_DESTROY: 
    PostQuitMessage(0); 
    break; 
    default: 
    return DefWindowProc(hWndProc,msg,wParam,lParam); 

    return 0; 

      

  5.   

    现在在资源里面建一个菜单,然后使用 LoadMenu() 函数取得菜单句柄,最后使用 SetMenu() 函数给你创建的窗口设置好菜单。当你显示窗口时自然就有菜单了。当然菜单的消息处理函数要你自己添加了!!!