|
For icons, see here and here.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
Ok, thank you, I guess I am on the right road regarding icons ... remain only context menu
|
|
|
|
|
I have an owerdraw ComboBox When a user selects an Item I want to Display the Detail info
I figure I could use the same Dialog for Background
So for the 6 CStatic and Their 6 Labels I do ShowWindow(SW_HIDE)
I saw the following post on how to drive DrawItem by Calling invalidate an the SetWindowText
Getting owner draw child control to paint when calling SetWindowText - vc.mfc[^]
So I create my own derived CStatic
class MyStatic : public CStatic
{ DECLARE_DYNAMIC(MyStatic)
public:
MyStatic();
~MyStatic();
void SetWindowText(LPSTR);
void DrawItem(LPDRAWITEMSTRUCT pdis);
};
This my SSetWindowText
void MyStatic::SetWindowText(LPSTR lpsz)
{
Invalidate();
CStatic::SetWindowText(lpsz);
}
two bad things on the way to getting where I want
1) I get an exception in wincore.cpp at the retrun ::CallWindowProc
RESULT CWnd::DefWindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam)
{
if (m_pfnSuper != NULL)
return ::CallWindowProc(m_pfnSuper, m_hWnd, nMsg, wParam, lParam);
WNDPROC pfnWndProc;
if ((pfnWndProc = *GetSuperWndProcAddr()) == NULL)
return ::DefWindowProc(m_hWnd, nMsg, wParam, lParam);
else
2) After the exception my Drawitem is called however ItemData doesn't have the String pointer and and is NULL
Thanks
|
|
|
|
|
Didn't have a message map entry from my Derived CStatic
also the text of the Static control isn't set in the itemData you have to a GetWindowText to get it
with those two fixes everything worked
|
|
|
|
|
有什么学习MFC的途径和论坛,我是MFC软件开发的。
|
|
|
|
|
Member 14076567 wrote: What are the ways and forums for learning MFC, I am developing MFC software.
This is an English-language site. Please post questions in English.
Via Google Translate:
这是一个英语网站。 请用英文发布问题。
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Hi
I’m again having different results in debug and release this one isn’t a bug but different program behavior.
I have 4 CwinThread Wrappers for CAsynSocket
In debug because processing is slowed somewhat by int 3 breakpoints I Receive all my about 3500 bytes of data from the Mainframe computer. In release I don’t get it all in one transmission I have a full word or a short int in the begging of the stream to tell me how much data
My method to debug this in the past was issue a AfxMessage and attach the debugger
This always seemed to work with the Mainthread
I didn’t even notice the message box come up in this scenario except by hovering my mouse on the tray at the bottom of the screen I don’t think I can use __debugbreak in Release
Anyway to stop this thread so that I can attach the debugger to see what’s going on
I forgot to add this UI thread was created before I created the CMainFrame Window however in the past I was able to have an AfxMessageBox in the CWinApp constructor and it worked
Thanks
modified 6-Dec-18 10:10am.
|
|
|
|
|
Why are you using AfxMessageBox in a secondary thread?
|
|
|
|
|
Will use Message box establish my main window before thread creation and will move the CFrameWnd ::m_hWnd to UI thread window thanks
|
|
|
|
|
It is not a good design to display a messagebox form any secondary thread.
Better would be PostMessage a user defined message to the main GUI thread with the parameters that you want to be displayed and let the main thread display it.
|
|
|
|
|
This is just to debug a scenario that only happen in release I have to have a way of stopping the thread in release and attaching the debugger if there is a better way please share thanks
|
|
|
|
|
How can I get all keyboard functionality for IExplorerBrowser[^] in a MFC app ? I have context menu options available for mouse, but not for keyboard (Ctrl+C, Ctrl+V, Ctrl+A, etc.). Is there any method to have these commands in my app ? I am pretty sure that is possible, but I don't know how
modified 6-Dec-18 3:47am.
|
|
|
|
|
These lines in My DrawItem Api are causing the heap corruption
if(arrayptr[pdi->itemID] == NULL)
arrayptr[pdi->itemID] = new char(9);
memset(arrayptr[pdi->itemID], 0x00, 9);
memcpy(arrayptr[pdi->itemID], lpszText, 8);
Don't understand it as I allocated everything on the Heap
|
|
|
|
|
Quote: arrayptr[pdi->itemID] = new char(9);
Should be
arrayptr[pdi->itemID] = new char[9];
|
|
|
|
|
WOW thanks good catch I didn't see however where the storage was initialized to 9 let me try
thanks
|
|
|
|
|
|
You are welcome.
Did you really need to use raw (C -like) arrays and new ?
|
|
|
|
|
I am MainFrame programmer by trade wasn't sure how to copy the first 8 characters of the 45 character strings
Thanks
|
|
|
|
|
I missed that twice in the original thread below. Well spotted.
|
|
|
|
|
Thank you, Richard.
|
|
|
|
|
Hi
I Decided to start a new thread because for a moment I thought I had fixed my problem of the Disappearing list with the following code
I added a point to an array pointer for the strings I wanted to add
class Casidcombo : public CComboBox
{
DECLARE_DYNAMIC(Casidcombo)
private:
int cright, cbottom, ctop;
public:
Casidcombo();
~Casidcombo();
char **arrayptr;
protected:
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
virtual void DrawItem(LPDRAWITEMSTRUCT pdi);
virtual int CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct);
virtual void DeleteItem(LPDELETEITEMSTRUCT lpDeleteItemStruct);
DECLARE_MESSAGE_MAP()
};
its the arrayptr not knowing exactly how may entries I would have I initialize it in the
OnInitDialogBox of the the Hosting Dialog
m_Simple.arrayptr = new char *[j+1];
for (int i = 0; i < j + 1; i++)
m_Simple.arrayptr[i] = NULL;
In the DrawItem For The Combobox I copy of over part of the string
if(arrayptr[pdi->itemID] == NULL)
arrayptr[pdi->itemID] = new char(9);
memset(arrayptr[pdi->itemID], 0x00, 9);
memcpy(arrayptr[pdi->itemID], lpszText, 8);
I then write it out
dc.DrawText(
arrayptr[pdi->itemID],
8,
&pdi->rcItem,
DT_CENTER | DT_SINGLELINE | DT_VCENTER);
The list now re-appears After I try closing out the Dialog by clicking on the 'X'
in the right hand Corner
I guess this drives the DrawItem function
My question is after appearing and disappearing initially (the list) of the ComboBox the vertical scroll bar is missing as well until I clisk on the 'X' in the right hand corner after which everything re-appears I guess that most Drive DrawItem I am still Baffled Why initially it disappears along with the scroll bar
This the last piece of code in the OnInitDialog
ShowWindow(SW_SHOW);
ShowWindow(SW_SHOW);
return TRUE;
This is my message map I only have a Measure Item Message
BEGIN_MESSAGE_MAP(Casidcombo, CComboBox)
ON_WM_MEASUREITEM()
END_MESSAGE_MAP()
modified 4-Dec-18 22:16pm.
|
|
|
|
|
I have used user drawn ListView controls without problem in the past. I notice that you are using a CDC to draw the text in the view rather than responding to the notification messages and returning the relevant data. However, my sample does not use MFC so I may well be on the wrong track.
|
|
|
|
|
Richard there are two api in DrawItem that are not supported in Native Win32 FillSolidRect only thing close is FillRect which takes a brush
Regardless I was getting a heap corruption so I ran my code in debug with the following
#if _DEBUG
afxMemDF = allocMemDF | checkAlwaysMemDF;
#endif
and at exiting DrawItem got the following
#if defined _NO_CRT_STDIO_INLINE
;
#else
{
int const _Result = __stdio_common_vsnprintf_s(
_CRT_INTERNAL_LOCAL_PRINTF_OPTIONS,
_Buffer, _BufferCount, _MaxCount, _Format, _Locale, _ArgList);
return _Result < 0 ? -1 : _Result;
}
#endif
Exiting DrawItem I am getting a heap corruption
|
|
|
|
|
You need to actually trace the code to see where the heap is getting corrupted. It is usually caused by writing too many bytes into an allocated buffer. Notice that __stdio_common_vsnprintf_s takes two values which indicate the length, so one of them could be wrong.
|
|
|
|
|
I Did but I don't understand why
I am getting a list of Addreess Spaces information from z/os I only want to Add the the list box the Job Name. Asid information is 45 bytes the first 8 is the JobName. So the First would be *Master*
I moved the code which copies the first 8 charcates from CComboBox::DrawItem to the DialogBox
just got Debug Assert on the AddString I think I am doing everything right;
m_Simple.arrayptr = new char *[j+1];
traverse = instr;
for (int i = 0; i < j + 1; i++)
{
m_Simple.arrayptr[i] = new char(9);
memset(m_Simple.arrayptr[i], 0x00, 9);
memcpy(m_Simple.arrayptr[i], traverse, 8);
m_Simple.AddString(m_Simple.arrayptr[i]);
traverse = (char *)traverse + 45;
}
The twisted Arrow after the Debug Heap Assertion is pointing to
traverse = (char *)traverse + 45
So I guess there is a problem with AddString
Not sure what I am doing wrong
|
|
|
|