2015-11-07 25 views
0

我有点新的C++,所以我开始了使用文本编辑器程序。我正在NetBeans IDE中开发此项目。目前该应用程序全部位于主源文件中。当我编译和运行项目时,我没有遇到任何错误,项目继续运行。C++的Win32未检索编辑数据,即使是编辑的范围

不过,我有某种错误或缺陷的是位于应用程序中,因为它正在运行。此错误与编辑控件GetWindowText函数()方法相关联。该问题位于saveFile()函数中。我想提出的GetWindowText函数()功能是测试,看看我是否可以检索从编辑控制文本,并将其用于我的需要。我试图通过一个简单的的MessageBox()函数效仿它,我什么也没得到。

的源代码[全部]:

/* 
* File: main.cpp 
* Author: CA1K 
* 
* Created on November 1, 2015, 9:58 PM 
*/ 

#include <iostream> 
#include <windows.h> 
#include <stdio.h> 
#include <string> 

using namespace std; 

// [ PROGRAM PROCEDURES ] 
//========================================================= 
/*Really what these are used for is to address conditions to 
*the WS_COMMAND case, these are registered as integers 
*/ 
#define IDC_MAIN_EDIT 0//edit ID 
#define EXIT_PROC 1//the exit procedure 
#define ABOUT_PROC 2//the trigger for the "about" window 
#define CLONE_PROC 3//spawn a new window 
#define SAVE_PROC 4//save procedure 
#define OPEN_PROC 5//copy procedure 
//========================================================= 

// [ DEVELOPER FRIENDLY VARIABLES ] 
//========================================================= 
const char g_szClassName[] = "CPadx1"; //window class name 
const char g_Title[] = "CPad"; //window title 
const char g_About[] = "CPad is a program developed by CA1K. It is entirely made from the win32 API. For more programs, go to ca1k.xkotto.com."; 
int dim = 600;//window dimensions(square) 
TCHAR buffer[512]; 
//========================================================= 

// [ OBJECT BUILDING ] 
//========================================================= 
void makeMenu(HWND hwnd){ 
HMENU hMenubar; 
HMENU hMenu; 
HMENU hMenu2; 
hMenubar = CreateMenu(); 
hMenu = CreateMenu(); 
hMenu2 = CreateMenu(); 
AppendMenuW(hMenu, MF_STRING, SAVE_PROC, L"&Save/Save as"); 
AppendMenuW(hMenu, MF_STRING, OPEN_PROC, L"&Open file"); 
AppendMenuW(hMenu, MF_SEPARATOR, 0, NULL); 
AppendMenuW(hMenu, MF_STRING, CLONE_PROC, L"&New Window"); 
AppendMenuW(hMenu, MF_SEPARATOR, 0, NULL); 
AppendMenuW(hMenu, MF_STRING, ABOUT_PROC, L"&About"); 
AppendMenuW(hMenubar, MF_POPUP, (UINT_PTR)hMenu, L"&File"); 
AppendMenuW(hMenu2, MF_STRING, EXIT_PROC, L"&Exit"); 
AppendMenuW(hMenubar, MF_POPUP, (UINT_PTR)hMenu2, L"&Config"); 
SetMenu(hwnd, hMenubar); 
} 

void dispWnd(HWND hwnd){//this function spawns a new window 
HINSTANCE hInstance; 
HWND newChild = CreateWindowEx(0, g_szClassName, g_Title, WS_OVERLAPPEDWINDOW, 
CW_USEDEFAULT, CW_USEDEFAULT, dim, dim, hwnd, NULL, hInstance, NULL); 
HWND GetParent(HWND hwnd); 
ShowWindow(newChild, 1); 
UpdateWindow(newChild); 
} 

void makeEdit(HWND hwnd, HWND hEdit){//this function creates the edit 
HINSTANCE hInstance; 
RECT rect; 
int pwidth; 
int pheight; 
if(GetWindowRect(hwnd, &rect)) 
{ 
pwidth = rect.right - rect.left; 
pheight = rect.bottom - rect.top; 
} 
hEdit = CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","", 
WS_CHILD|WS_VISIBLE|ES_AUTOVSCROLL|ES_AUTOHSCROLL|ES_MULTILINE, 
0,0,pwidth,pheight,hwnd,(HMENU)IDC_MAIN_EDIT, 
hInstance,NULL); 
} 

void saveFile(HWND hEdit){ 
GetWindowText(hEdit, buffer, 512); 
MessageBox(NULL, buffer, "Test", MB_ICONINFORMATION); 
} 

//========================================================= 

// [ SOFTWARE PROCESSING ] 
//========================================================= 
// Step 4: the Window Procedure 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
HWND winEdit; 
switch(msg) 
{ 
    /*WINDOW ACTIONS*/ 
    case WM_CREATE:{//on window creation 
     makeMenu(hwnd); 
     makeEdit(hwnd,winEdit); 
    } 
    break; 
    case WM_SIZE: 
     makeEdit(hwnd,winEdit); 
    break; 
    case WM_COMMAND://window actions 
     switch(LOWORD(wParam)) 
     { 
      case ABOUT_PROC: 
       MessageBox(NULL, g_About, "About", MB_ICONINFORMATION); 
      break; 
      case EXIT_PROC: 
       PostQuitMessage(0);//exit program 
      break; 
      case CLONE_PROC: 
       dispWnd(hwnd); 
      break; 
      case SAVE_PROC: 
       saveFile(winEdit); 
      break; 
     } 
    break; 
    case WM_CLOSE://on window close 
     DestroyWindow(hwnd); 
    break; 
    case WM_DESTROY://on window destroy 
     PostQuitMessage(0); 
    break; 
    default://default method 
     return DefWindowProc(hwnd, msg, wParam, lParam); 
} 
return 0; 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
LPSTR lpCmdLine, int nCmdShow) 
{ 
WNDCLASSEX wc; 
HWND hwnd; 
MSG Msg; 

//Step 1: Registering the Window Class 
wc.cbSize  = sizeof(WNDCLASSEX); 
wc.style   = 0; 
wc.lpfnWndProc = WndProc; 
wc.cbClsExtra = 0; 
wc.cbWndExtra = 0; 
wc.hInstance  = hInstance; 
wc.hIcon   = LoadIcon(NULL, IDI_APPLICATION); 
wc.hCursor  = LoadCursor(NULL, IDC_ARROW); 
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 
wc.lpszMenuName = NULL; 
wc.lpszClassName = g_szClassName; 
wc.hIconSm  = LoadIcon(NULL, IDI_APPLICATION); 

if(!RegisterClassEx(&wc)) 
{ 
    MessageBox(NULL, "Window Registration Failed!", "Error!", 
     MB_ICONEXCLAMATION | MB_OK); 
    return 0; 
} 

// Step 2: Creating the Window 
hwnd = CreateWindowEx(
    WS_EX_CLIENTEDGE, 
    g_szClassName, 
    g_Title, 
    WS_OVERLAPPEDWINDOW, 
    CW_USEDEFAULT, CW_USEDEFAULT, dim, dim, 
    NULL, NULL, hInstance, NULL); 

if(hwnd == NULL) 
{ 
    MessageBox(NULL, "Window Creation Failed!", "Error!", 
     MB_ICONEXCLAMATION | MB_OK); 
    return 0; 
} 
ShowWindow(hwnd, nCmdShow); 
UpdateWindow(hwnd); 

// Step 3: The Message Loop 
while(GetMessage(&Msg, NULL, 0, 0) > 0) 
{ 
    TranslateMessage(&Msg); 
    DispatchMessage(&Msg); 
} 
return Msg.wParam; 

} 
//========================================================= 

我质疑我是否有错误的范围,或别的东西。反馈将非常感谢。

-CA1K

+0

'winEdit'传递给'makeEdit( )'的价值。编辑窗口的HWND值会丢失,并且'winEdit'永远不会改变。您需要将'hEdit'参数设置为'makeEdit()'指针,引用或返回值。 – andlabs

+0

我做你推荐什么,但现在我得到“默认IME” ...的返回值 –

+0

也winEdit应该是静态的,因为你是在其他消息 – stackptr

回答

1

你需要让winEdit一个静态变量。这是因为您在多条消息中使用它,如WM_CREATEWM_COMMAND。然后,你需要一个指向HWND传递到您的makeEdit功能:

makeEdit(hwnd, &winEdit);

所以整体的窗口过程应该是这样的:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
static HWND winEdit; 
switch(msg) 
{ 
    /*WINDOW ACTIONS*/ 
    case WM_CREATE:{//on window creation 
     makeMenu(hwnd); 
     makeEdit(hwnd, &winEdit); 
    } 
    break; 
    case WM_SIZE: 
     makeEdit(hwnd,winEdit); 
    break; 
    case WM_COMMAND://window actions 
     switch(LOWORD(wParam)) 
     { 
      case ABOUT_PROC: 
       MessageBox(NULL, g_About, "About", MB_ICONINFORMATION); 
      break; 
      case EXIT_PROC: 
       PostQuitMessage(0);//exit program 
      break; 
      case CLONE_PROC: 
       dispWnd(hwnd); 
      break; 
      case SAVE_PROC: 
       saveFile(winEdit); 
      break; 
     } 
    break; 
    case WM_CLOSE://on window close 
     DestroyWindow(hwnd); 
    break; 
    case WM_DESTROY://on window destroy 
     PostQuitMessage(0); 
    break; 
    default://default method 
     return DefWindowProc(hwnd, msg, wParam, lParam); 
} 
return 0; 
}