Text with backspace in Transparent window
-
I want to know how I can write text with backspace in a transparent window. I am using this code but it does not work. #include <afxwin.h> ////////////////////////////////////////////////////////////////////////// // CMyFrameWnd class CMyFrameWnd : public CFrameWnd { public: CMyFrameWnd(); protected: CString m_Text; //{{AFX_MSG(CMyFrameWnd) afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnPaint(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd) //{{AFX_MSG_MAP(CMyFrameWnd) ON_WM_CHAR() ON_WM_PAINT() //}}AFX_MSG_MAP END_MESSAGE_MAP() CMyFrameWnd::CMyFrameWnd() { //Transparent window CString strMyClass=AfxRegisterWndClass( NULL, NULL, (HBRUSH) NULL); Create(strMyClass, _T("Frame Window")); } void CMyFrameWnd::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { m_Text += nChar; if (nChar == VK_BACK) { m_Text = m_Text.Left(m_Text.GetLength() - 2); TRACE("\n%s", m_Text); } Invalidate(); } void CMyFrameWnd::OnPaint() { CPaintDC dc (this); dc.TextOut(0,0,m_Text); } ////////////////////////////////////////////////////////////////////////// class CMyApp : public CWinApp { public: CMyApp(){}; virtual BOOL InitInstance(); }; BOOL CMyApp::InitInstance() { m_pMainWnd = new CMyFrameWnd(); m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); return TRUE; } CMyApp myApp; If I use a normal window changing: CString strMyClass=AfxRegisterWndClass( NULL, NULL, (HBRUSH) NULL); Create(strMyClass, _T("Frame Window")); to Create(NULL, _T("Frame Window")); backspace work well Can you give me any idea Thanks
-
I want to know how I can write text with backspace in a transparent window. I am using this code but it does not work. #include <afxwin.h> ////////////////////////////////////////////////////////////////////////// // CMyFrameWnd class CMyFrameWnd : public CFrameWnd { public: CMyFrameWnd(); protected: CString m_Text; //{{AFX_MSG(CMyFrameWnd) afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnPaint(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd) //{{AFX_MSG_MAP(CMyFrameWnd) ON_WM_CHAR() ON_WM_PAINT() //}}AFX_MSG_MAP END_MESSAGE_MAP() CMyFrameWnd::CMyFrameWnd() { //Transparent window CString strMyClass=AfxRegisterWndClass( NULL, NULL, (HBRUSH) NULL); Create(strMyClass, _T("Frame Window")); } void CMyFrameWnd::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { m_Text += nChar; if (nChar == VK_BACK) { m_Text = m_Text.Left(m_Text.GetLength() - 2); TRACE("\n%s", m_Text); } Invalidate(); } void CMyFrameWnd::OnPaint() { CPaintDC dc (this); dc.TextOut(0,0,m_Text); } ////////////////////////////////////////////////////////////////////////// class CMyApp : public CWinApp { public: CMyApp(){}; virtual BOOL InitInstance(); }; BOOL CMyApp::InitInstance() { m_pMainWnd = new CMyFrameWnd(); m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); return TRUE; } CMyApp myApp; If I use a normal window changing: CString strMyClass=AfxRegisterWndClass( NULL, NULL, (HBRUSH) NULL); Create(strMyClass, _T("Frame Window")); to Create(NULL, _T("Frame Window")); backspace work well Can you give me any idea Thanks
It is working - it's just that with a NULL brush, the Invalidate call won't erase the characters you're backspacing over, as it paints over them with transparency. Try entering the following text in the window - abcd - you'll end up with abd after that, which shows that the backspace is being recognised.
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
-
It is working - it's just that with a NULL brush, the Invalidate call won't erase the characters you're backspacing over, as it paints over them with transparency. Try entering the following text in the window - abcd - you'll end up with abd after that, which shows that the backspace is being recognised.
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
-
Hi Mr. Dootson: Yes, I can see m_text contains "abc" after bakcspace but my transparent window shows "abcd". I need erase text or backspace draw in my transparent window. How can I do that? Do you have any idea?. Thanks
Weird - the window displayed "abd" when I did that - and I used the same code as you - well, the only difference is how I created the window. I put your window class registration code in the
PreCreateWindow
method of my view:BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CWnd::PreCreateWindow(cs))
return FALSE;cs.dwExStyle |= WS_EX_CLIENTEDGE;
cs.style &= ~WS_BORDER;
cs.lpszClass=AfxRegisterWndClass( NULL, NULL, (HBRUSH) NULL);return TRUE;
}This method is called from within the
CWnd::Create
method, so should do much the same as your code?Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
-
Weird - the window displayed "abd" when I did that - and I used the same code as you - well, the only difference is how I created the window. I put your window class registration code in the
PreCreateWindow
method of my view:BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CWnd::PreCreateWindow(cs))
return FALSE;cs.dwExStyle |= WS_EX_CLIENTEDGE;
cs.style &= ~WS_BORDER;
cs.lpszClass=AfxRegisterWndClass( NULL, NULL, (HBRUSH) NULL);return TRUE;
}This method is called from within the
CWnd::Create
method, so should do much the same as your code?Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
Hi Mr.Dootson: I had added // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMyFrameWnd) virtual BOOL PreCreateWindow(CREATESTRUCT& cs); //}}AFX_VIRTUAL in my Class declarations and your PreCreateWindow code as BOOL CMyFrameWnd::PreCreateWindow(CREATESTRUCT& cs) { if (!CWnd::PreCreateWindow(cs)) return FALSE; cs.dwExStyle |= WS_EX_CLIENTEDGE; cs.style &= ~WS_BORDER; cs.lpszClass=AfxRegisterWndClass( NULL, NULL, (HBRUSH) NULL); return TRUE; } How I have to change Create? I used: Create(NULL, _T("Frame Window")) but it doesn't works. I get and ASSERT in wincore.cpp Line:722 and there is not any text in my window. What >I am doing wrong? Thanks
-
Hi Mr.Dootson: I had added // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMyFrameWnd) virtual BOOL PreCreateWindow(CREATESTRUCT& cs); //}}AFX_VIRTUAL in my Class declarations and your PreCreateWindow code as BOOL CMyFrameWnd::PreCreateWindow(CREATESTRUCT& cs) { if (!CWnd::PreCreateWindow(cs)) return FALSE; cs.dwExStyle |= WS_EX_CLIENTEDGE; cs.style &= ~WS_BORDER; cs.lpszClass=AfxRegisterWndClass( NULL, NULL, (HBRUSH) NULL); return TRUE; } How I have to change Create? I used: Create(NULL, _T("Frame Window")) but it doesn't works. I get and ASSERT in wincore.cpp Line:722 and there is not any text in my window. What >I am doing wrong? Thanks
gcorrea wrote:
How I have to change Create?
I don't call Create at all - the view window's created by my CMainFrame class, which in turn is created within my application classes InitInstance method. So, slightly different class structure to yours. In your app's InitInstance method, changing
m_pMainWnd = new CMyFrameWnd();
to
m_pMainWnd = new CMyFrameWnd();
m_pMainWnd->Create();could probably work
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
-
gcorrea wrote:
How I have to change Create?
I don't call Create at all - the view window's created by my CMainFrame class, which in turn is created within my application classes InitInstance method. So, slightly different class structure to yours. In your app's InitInstance method, changing
m_pMainWnd = new CMyFrameWnd();
to
m_pMainWnd = new CMyFrameWnd();
m_pMainWnd->Create();could probably work
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
-
So add in the necessary parameters! My MainFrame class uses these parameters to create the view:
m_wndView.Create(NULL, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(0, 0, 0, 0), this, 0xE900, NULL);
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
-
So add in the necessary parameters! My MainFrame class uses these parameters to create the view:
m_wndView.Create(NULL, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(0, 0, 0, 0), this, 0xE900, NULL);
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
Doing that I get: error C2664: 'Create' : cannot convert parameter 6 from 'const int' to 'const char *' This is referring to 0xE900. Do you think it is possible to send me your code to gcorrea@cguelectronics.com in order to evaluate? Thanks
-
Doing that I get: error C2664: 'Create' : cannot convert parameter 6 from 'const int' to 'const char *' This is referring to 0xE900. Do you think it is possible to send me your code to gcorrea@cguelectronics.com in order to evaluate? Thanks
Again the different class thing gets in the way. How about you read the documentation for your frame window vs. CWnd - that'll show you how the parameters fit in.
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
-
Again the different class thing gets in the way. How about you read the documentation for your frame window vs. CWnd - that'll show you how the parameters fit in.
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
-
I had used differents parameters and ones don not compile, give me errors, others ones compile but give assertion failure but any works. Could you Mr. Dootson attach your working code zipped to compare what I am doing wrong?