Re: "edit" control is read only?
"Robby" <Robby@discussions.microsoft.com> wrote in message
news:1389860C-CB43-4800-8EE5-6E85257EF01D@microsoft.com
Hello John/newsgroups!
I have come down to 3 simple files containing pretty much the minimal
standard code required to get an edit control to work... here is the
actual code... I am still having the problem...Usually when you click
on an edit control, it supposed to automatically get the focus and we
should be able to type text in there! If I may politely ask someone
to take a glimpse at the following code and see why I can't edit the
edit control field by simply clicking on it!
==============================================Main.cpp
#include <windows.h>
//DECLARE CALLBACKS
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProc_CW2 (HWND, UINT, WPARAM, LPARAM);
//Name and Class name of main window
static TCHAR *szMW_Name = TEXT ("MAIN APPLICATION 1");
static TCHAR szMW_ClassName[] = TEXT ("MW");
//Child window #2 (Programming GUI)
static TCHAR szCW2_ClassName[] = TEXT("CW2");
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInnstance,
PSTR szCmdLine, int iCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
//-MAIN WINDOW CONFIGURATION
wndclass.style = CS_HREDRAW |CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szMW_ClassName;
//-REGISTRATION
RegisterClass (&wndclass);
// CHILD WINDOW #2 CONFIGURATION
wndclass.style = CS_HREDRAW |CS_VREDRAW;
wndclass.lpfnWndProc = WndProc_CW2;
wndclass.hIcon = LoadIcon (NULL, IDI_EXCLAMATION);
wndclass.hIcon = NULL;
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wndclass.lpszClassName = szCW2_ClassName;
//-REGISTRATION
RegisterClass(&wndclass); //Programming GUI
//-CREATE MAIN APPLICATION WINDOW
hwnd = CreateWindow (szMW_ClassName,szMW_Name,
WS_OVERLAPPEDWINDOW ,
20, 20, 750, 550, NULL,NULL, hInstance, NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow (hwnd);
while (GetMessage (&msg, NULL, 0, 0)) //Window's queue loop
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
================================================
=======================================WndProc.cpp
#include <windows.h>
struct hdMW_WindowButtonsTAG
{
int iCTL_idx;
TCHAR *szMW_btC_Name;
int MW_btC_RectLeft;
int MW_btC_RectTop;
int MW_btC_RectRight;
int MW_btC_RectBottom;
int MW_btC_ID;
};
#define CW2_ID 2 //Child window ID
//Child window title bar name
static TCHAR *szCW2_Name = TEXT("Programming GUI");
//Child window class name
extern TCHAR szCW2_ClassName[] = TEXT("CW2");
LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
WPARAM wParam, LPARAM
lParam) {
int i;
//MAIN CONTROL PROPERTIES
hdMW_WindowButtonsTAG WindowButtons[] =
{
1,TEXT("< EXIT >"),650,450,80,40,1,
2,TEXT("< Connect! >"),10,30,180,30,2,
3,TEXT("< GUI >"),200,30,180,30,3,
};
//Child window handle(s)
static HWND hdCWdws[2];
static HWND hdMW_WindowButtons[3]; //Main window buttons
switch(message)
{
case WM_CREATE:
//MAIN WINDOW BUTTON CONTROLS
for(i=0;i<3;i++)
{
hdMW_WindowButtons[i] = CreateWindow( TEXT
("button"),WindowButtons[i].szMW_btC_Name,
WS_CHILD | WS_VISIBLE |BS_PUSHBUTTON | WS_CLIPSIBLINGS,
WindowButtons[i].MW_btC_RectLeft,
WindowButtons[i].MW_btC_RectTop,
WindowButtons[i].MW_btC_RectRight,
WindowButtons[i].MW_btC_RectBottom,
hwnd,(HMENU)WindowButtons[i].MW_btC_ID,
(HINSTANCE) GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
}
return 0;
case WM_COMMAND:
//IF EXIT BUTTON CLICKED THEN EXIT APPLICATION
if (LOWORD(wParam) == WindowButtons[0].MW_btC_ID)
{
DestroyWindow(hwnd); //End application
}
//CREATE CHILD WINDOW #2 WHEN BUTTON #2 PRESSED
else if (LOWORD(wParam) == WindowButtons[2].MW_btC_ID)
hdCWdws[1] = CreateWindow(
szCW2_ClassName,szCW2_Name,
WS_CHILD | WS_CAPTION | WS_SYSMENU,
10, 10, 700, 450,hwnd,(HMENU)CW2_ID,
(HINSTANCE)
GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
BringWindowToTop(hdCWdws[1]);
//SHOW CHILD WINDOW #2
ShowWindow(hdCWdws[1],SW_SHOW);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
=================================================
=========================================WndProc_CW2.cpp
#include <windows.h>
struct hdCW2_WindowButtonsTAG
{
int iCTL_idx;
TCHAR *szMW_btC_Name;
int MW_btC_RectLeft;
int MW_btC_RectTop;
int MW_btC_RectRight;
int MW_btC_RectBottom;
int MW_btC_ID;
};
LRESULT CALLBACK WndProc_CW2(HWND hwnd, UINT message,
WPARAM wParam, LPARAM
lParam) {
static HWND HWND1;
switch(message)
{
case WM_CREATE:
HWND1 = CreateWindow( TEXT ("edit"), TEXT("zero"),
WS_CHILD | WS_VISIBLE | WS_BORDER |
ES_LEFT | ES_MULTILINE, 10,10,50,30, hwnd,(HMENU)800,
(HINSTANCE) GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
return 0;
case WM_CLOSE: //Handler to do code on close
break;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
==================================================
All feedback greatly appreciated!
Your problem is that you have a caption bar on a child window. You can get
away with this to a limited degree (just as you can get away with child
windows that overlap to a degree), but it gives you problems when you want
to have a child of a child. I think it is just a bug in Windows.
You can easily confirm that if you remove the WS_CAPTION style from WINDOW
#2, then the problem goes away (add the WS_BORDER style, so you can see what
is happening).
Two possibilities:
1. Use owned windows rather than child windows, as per an earlier post of
mine.
2. Create a MDI application (Petzold, Chapter 19).
There are more elaborate options, like "faking" a title bar, but I don't
think you want to go there.
--
John Carson