2012-06-20 15 views
-1

我想用C++開發一個帶有菜單的記事本。代碼如下。在C++中開發一個記事本

#include <windows.h> 
#define IDI_APP_ICON 1 
#define IDD_ABOUT 100 
#define IDC_STATIC 101 
#define IDM_MAINMENU 200 
#define IDM_FILE_NEW 201 
#define IDM_FILE_OPEN 203 
#define IDM_FILE_SAVE 204 
#define IDM_FILE_EXIT 205 
#define IDM_HELP_ABOUT 206 

class MainWindow 
{ 
public: 
MainWindow(HINSTANCE hInstance); 
~MainWindow(); 
static LRESULT CALLBACK MainWndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM  lParam); 

static void OnCommand(HWND hwnd, int id, HWND hCtl, UINT codeNotify); 
bool Run(int nCmdShow); 

private: 
WNDCLASSEX m_wndClass; 
static HINSTANCE m_hInstance; 
HWND m_hwnd; 
static char m_szClassName[]; 
}; 

class AboutDialog 
{ 
public: 
AboutDialog(); 
~AboutDialog(); 
static BOOL CALLBACK DialogProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); 
int Run(HINSTANCE hInstance, HWND hParent); 

private: 
HWND m_hwnd; 
}; 

AboutDialog::AboutDialog() 
{ 
} 

AboutDialog::~AboutDialog() 
{ 
} 

// Function: Run 
// Returns: Result of the DialogBox 
int AboutDialog::Run(HINSTANCE hInstance, HWND hParent) 

{ 
int retval = DialogBox(
    hInstance, 
    MAKEINTRESOURCE(IDD_ABOUT), // Dialog template 
    hParent, // Pointer to parent hwnd 
    DialogProc); 

} 
BOOL CALLBACK 
AboutDialog::DialogProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
int retVal = false; 
switch(msg) 
{ 
case WM_INITDIALOG: 
    retVal = true; 
    break; 
case WM_COMMAND: 
    if(LOWORD(wParam)== IDOK) 
     EndDialog(hwnd, TRUE); 
    break; 
case WM_CLOSE: 
    EndDialog(hwnd, TRUE); 
    break; 
} 
return retVal; 
} 


char MainWindow::m_szClassName[] = "DrawLite"; 
HINSTANCE MainWindow::m_hInstance = NULL; 

MainWindow::MainWindow(HINSTANCE hInstance) 
{ 
m_hInstance = hInstance; // Save Instance handle 

m_wndClass.cbSize = sizeof(WNDCLASSEX); // Must always be sizeof(WNDCLASSEX) 
m_wndClass.style = CS_DBLCLKS; // Class styles 
m_wndClass.lpfnWndProc = MainWndProc; // Pointer to callback procedure 
m_wndClass.cbClsExtra = 0; 
m_wndClass.cbWndExtra = 0; 
m_wndClass.hInstance = hInstance; 
m_wndClass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); 
m_wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); 
m_wndClass.hbrBackground = (HBRUSH) (COLOR_WINDOW); 
m_wndClass.lpszMenuName = MAKEINTRESOURCE(IDM_MAINMENU); 
m_wndClass.lpszClassName = m_szClassName; 
m_wndClass.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); 
} 


MainWindow::~MainWindow() 
{ 
} 


LRESULT CALLBACK MainWindow::MainWndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
switch (msg) 
{ 
case WM_DESTROY: 
    PostQuitMessage (0); 
    break; 
case WM_COMMAND: 
//HANDLE_WM_COMMAND(hwnd, wParam, lParam, OnCommand); 
    break; 
default: 
    return DefWindowProc (hwnd, msg, wParam, lParam); 
} 

return 0; 
} 


void MainWindow::OnCommand(HWND hwnd, int id, HWND hCtl, UINT codeNotify) 
{ 
switch(id) 
{ 
case IDM_FILE_EXIT: 
    PostQuitMessage(0); 
    break; 
case IDM_HELP_ABOUT: 
    AboutDialog* dlg = new AboutDialog(); 
    dlg->Run(m_hInstance, hwnd); 
    delete dlg; dlg = NULL; 
    break; 
} 
} 

bool MainWindow::Run(int nCmdShow) 
{ 
if(!RegisterClassEx(&m_wndClass)) 
    return false; 
m_hwnd = CreateWindowEx(
     0, 
     m_szClassName, 
     "Draw Lite", 
     WS_OVERLAPPEDWINDOW, 
     CW_USEDEFAULT, 
     CW_USEDEFAULT, 
     500, 
     400, 
     NULL, 
     NULL, 
     m_hInstance, 
     NULL 
     ); 
if(!m_hwnd) 
    return false; 
ShowWindow(m_hwnd, nCmdShow); 
return true; 
} 
int WINAPI 
WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow) 
{ 
MSG msg; 

MainWindow *winMain = new MainWindow(hInst); 
if(!winMain->Run(nCmdShow)) 
{ 
    delete winMain; 
    return 1; // error 
} 

// Run the message loop. It will run until GetMessage() returns 0 
while (GetMessage (&msg, NULL, 0, 0)) 
{ 
    // Translate virtual-key messages into character messages 
    TranslateMessage(&msg); 
    // Send message to WindowProcedure 
    DispatchMessage(&msg); 
} 

delete winMain; 

return msg.wParam; 
} 

我有一個鏈接器錯誤,不知道如何解決它,因爲我在這個領域是相當新的。我想知道有人能幫助我解決這個問題。謝謝,

這是我收到

[Linker error] undefined reference to [email protected]' 

錯誤,這也[Linker error] undefined reference to [email protected]'

阿西夫

+3

你應該說錯誤是什麼。 –

+2

請發佈鏈接器錯誤,編譯命令等,如果沒有它,我們無法幫助您。 – Linuxios

+0

這是錯誤消息[鏈接器錯誤]未定義的引用'_ZN11AboutDialog10DialogProcEP6HWND__jjl @ 16',這也是[鏈接器錯誤]未定義的引用'_ZN11AboutDialog10DialogProcEP6HWND__jjl @ 16' –

回答

1

雖然你沒有任何大規模的錯誤,在這裏,你的一些小那些。正如鏈接器所說,您已聲明但尚未定義AboutDialog::DialogProc

您尚未從AboutDialog::Run(您已定義名爲retval的變量,但尚未返回其值)返回值。

您確實需要修復縮進。

您沒有主消息循環(可能應該是在丟失的main/WinMain)?

您還沒有包含任何代碼來創建和Run()MainWindow類的實例。你通常會在mainWinMain(你似乎都沒有定義過)中這樣做。

+0

我已經添加了Winmain。它編譯好沒有任何錯誤消息,但只有一個空白窗口。請指導在何處添加有關dailog的代碼。謝謝, –

+0

您還需要一個資源文件來爲初學者定義菜單和對話框模板。 –