|
Something I didn't do well , because at me is still white bkg/text color ...
|
|
|
|
|
Hi, which background you are talking about whether drop down list or in combo box itself.
|
|
|
|
|
I mean drop down list , not edit box where I succeded :
HBRUSH CComboBoxExt::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if(nCtlColor == CTLCOLOR_EDIT)
{
if(! m_bAlertText)pDC->SetTextColor(COLOR_BLACK);
else pDC->SetTextColor(COLOR_RED);
if(! m_bAlertBkg)pDC->SetBkColor(COLOR_WHITE);
else pDC->SetBkColor(COLOR_ALERT);
}
pDC->SetBkMode(TRANSPARENT);
if(m_bAlertBkg)return m_hBrushAlert;
return m_hBrushWhite;
}
well , I change CTLCOLOR_EDIT with CTLCOLOR_LISTBOX but with no effect ... I don't know why ...
|
|
|
|
|
In above code, that is, subclassed combo box's OnCtlColor() member, you should handle CTLCOLOR_LISTBOX for dropped-down list box.
May be, subclassing fails.
To ensure that above code is called, put the following line on top of function.
TRACE(_T("CComboBoxExt::OnCtlColor() was called with nCtlColor: %d\n"), nCtlColor);
And watch output window to see above phrase.
|
|
|
|
|
I think I am in dead point ... I use already OnCtlColorListBox but for other reason , and with other signature :
ON_MESSAGE(WM_CTLCOLORLISTBOX, OnCtlColorListBox)
...
...
LRESULT CComboBoxExt::OnCtlColorListBox(WPARAM wParam, LPARAM lParam)
{
if(m_hListBox == NULL)
{
HWND hWnd = reinterpret_cast<HWND>(lParam);
if(hWnd != 0 && hWnd != m_hWnd)
{
m_hListBox = hWnd;
m_pWndProc = reinterpret_cast<WNDPROC>(GetWindowLong(m_hListBox, GWL_WNDPROC));
SetWindowLong(m_hListBox, GWL_WNDPROC, reinterpret_cast<long>(ComboBoxListBoxProc));
}
}
return 1;
}
to get a handle to list box window ...
|
|
|
|
|
Yes. This blocks OnCtlColor(CTLCOLOR_LISTBOX). OnCtlColor() (WM_CTLCOLOR) is retained from 16Bit Windows and should be managed by MFC using newer messages like WM_CTLCOLORLISTBOX.
You can also use this handler to do your work, the HDC is wParam and you need to return a valid HBRUSH.
But, above return value is invalid (as brush). Probably, that listbox should paint itself if this doesn't produce a problem. In this case, how could you paint again?
|
|
|
|
|
To make a review :
ON_MESSAGE(WM_CTLCOLORLISTBOX, OnCtlColorListBox)
ON_WM_CTLCOLOR()
LRESULT CComboBoxExt::OnCtlColorListBox(WPARAM wParam, LPARAM lParam)
{
if(m_hListBox == NULL)
{
HWND hWnd = reinterpret_cast<HWND>(lParam);
if(hWnd != 0 && hWnd != m_hWnd)
{
m_hListBox = hWnd;
m_pWndProc = reinterpret_cast<WNDPROC>(GetWindowLong(m_hListBox, GWL_WNDPROC));
SetWindowLong(m_hListBox, GWL_WNDPROC, reinterpret_cast<long>(ComboBoxListBoxProc));
}
}
return 1;
}
HBRUSH CComboBoxExt::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);
if(nCtlColor == CTLCOLOR_EDIT)
{
if(! m_bAlertText)pDC->SetTextColor(COLOR_BLACK);
else pDC->SetTextColor(COLOR_RED);
if(! m_bAlertBkg)pDC->SetBkColor(COLOR_WHITE);
else
{
pDC->SetBkColor(COLOR_ALERT);
hbr = m_hBrushAlert;
}
}
pDC->SetBkMode(TRANSPARENT);
return hbr;
}
|
|
|
|
|
Don't use both. Use 1st one.
LRESULT CComboBoxExt::OnCtlColorListBox(WPARAM wParam, LPARAM lParam)
{
...
CDC* pDC = CDC::FromHandle((HDC)wParam);
...
return hbr;
}
|
|
|
|
|
BTW, beware that list box is already subclassed by other reason. If it paints itself without using windows behaviour, that is, without sending WM_CTLCOLOR notifications to its parent, your attempt can be failed again.
|
|
|
|
|
I did not tried the subclassed combobox, but according to msdn,
http://msdn.microsoft.com/en-us/library/0wwk06hc(v=vs.80).aspx[^]
In subclassed combobox you have to handle CTLCOLOR_LISTBOX to change the color.
I tried handling OnCtlColor in dialog box,with nCtrClr == (IDOFCOMBOBOX),it is working
HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (pWnd->GetDlgCtrlID() == IDC_COMBO1)
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(128,128, 128));
hbr = m_brush;
}
return hbr;
}
|
|
|
|
|
I solve the problem in the follow matter :
CListBox m_ListBox;
ON_WM_CTLCOLOR()
HBRUSH CComboBoxExt::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);
if(nCtlColor == CTLCOLOR_EDIT)
{
if(m_Edit.GetSafeHwnd() == NULL)
{
m_Edit.SubclassWindow(pWnd->GetSafeHwnd());
}
if(! m_bAlertText)pDC->SetTextColor(COLOR_BLACK);
else pDC->SetTextColor(COLOR_RED);
if(! m_bAlertBkg)pDC->SetBkColor(COLOR_WHITE);
else
{
pDC->SetBkColor(COLOR_ALERT);
hbr = m_hBrushAlert;
}
}
if(nCtlColor == CTLCOLOR_LISTBOX)
{
if(m_ListBox.GetSafeHwnd() == NULL)
{
m_ListBox.SubclassWindow(pWnd->GetSafeHwnd());
m_pWndProc = reinterpret_cast<WNDPROC>(GetWindowLong(m_ListBox, GWL_WNDPROC));
SetWindowLong(m_ListBox, GWL_WNDPROC, reinterpret_cast<long>(ComboBoxListBoxProc));
}
if(! m_bAlertBkg)pDC->SetBkColor(COLOR_WHITE);
else
{
pDC->SetBkColor(COLOR_ALERT);
hbr = m_hBrushAlert;
}
}
pDC->SetBkMode(TRANSPARENT);
return hbr;
}
I get handle of drop down list box in OnCtlColor
but I still have an question :
How can I change text / background color of edit while combo box have CBS_DROPDOWNLIST style ?
|
|
|
|
|
Finllay I solve my problem , and for that I thank you very much , for you kindness and for your patient . ! Best wishes !
|
|
|
|
|
I solve the problem in follow way :
class CMyComboBox : public CComboBox
{
afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
};
and
ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()
HBRUSH CMyComboBox::CtlColor(CDC* pDC, UINT nCtlColor)
{
HBRUSH hBrush = NULL;
switch(nCtlColor)
{
case CTLCOLOR_EDIT:
{
pDC->SetBkColor(RGB(255, 0, 0));
pDC->SetTextColor(RGB(255, 255, 255));
hBrush = m_brush;
}
break;
}
return hBrush;
}
|
|
|
|
|
Hi,
I have drived a class from CView and create class instance using new.
I am confused in deleting view.
Shell I use delete view;
Or view->DestroyWindow();
|
|
|
|
|
Call DestroyWindow() , then delete ...
|
|
|
|
|
If I do call this, I got exception.
|
|
|
|
|
Where does the exception occur? ...check to make sure you're not deallocating the same batch of memory twice within the object. Typically the DestroyWindow call will do just that, destroy the window, but the resources don't get deallocated until you delete the object... and if you explicitly called new then odds are you explicitly have to call delete , otherwise you'll be leaking memory. Exceptions to this rule occur when the framework itself deallocates the memory, in this case usually you can find info on the framework's website (MFC=>MSDN).
|
|
|
|
|
Use view->DestroyWindow(); to destroy the visible Window (or View) associated with the instance of your CView derived class. Then once the window has been disposed of properly you can use delete , if appropriate, to dispose of your view object.
I must get a clever new signature for 2011.
|
|
|
|
|
Hi ,
I am having a std map object. I have added key and value in the following order.
mymap.insert (pair<int,int>(10,20)) ;
mymap.insert (pair<int,int>(5,20)) ;
mymap.insert (pair<int,int>(104,20)) ;
mymap.insert (pair<int,int>(1,20)) ;
But while extracting the data from map I am getting this data in a sorted order (sorted by Key order). How can I prevent this . I am passing the data from this map to a device which needs the data as is from my map. Please help
|
|
|
|
|
maps are always sorted. the tree structure that they use internally requires it.
if you want an unsorted container, use a vector (or a list).
|
|
|
|
|
If you want to maintain the order of insertion, then you could create a list alongside your map. Each insert will give you an iterator in return, which references the newly inserted element. Store this element in your list, and you're done. If you want to retrieve your elements in order of insertion, use the list. If you want it ordered by key, or just want to retrieve a single object with a key, use your map.
class MyMap {
std::map<int,int> m_map;
std::list<pair<int,int> > m_list;
public:
typedef std::list<pair<int,int> >::iterator insert_iterator;
typedef std::map<int,int>::iterator key_iterator;
void insert(int key, int value) {
m_list.push_back(m_map.insert(pair<int,int>(key, value)));
}
insert_iterator ibegin() { return m_list.begin(); }
insert_iterator iend() { return m_list.end(); }
key_iterator kbegin() { return m_map.begin(); }
key_iterator kend() { return m_map.end(); }
};
Note that you will have to dereference your insert_iterator twice: once to get the list element which is an iterator to the map, and a second time to get the actual element of the map:
MyMap mymap;
mymap.insert(5, 15);
mymap.insert(100, 20);
mymap.insert(34, 30);
for (MyMap::key_iterator kit = mymap.kbegin(); kit != mymap.kend(); ++kit)
std::cout << (*kit).second << std::endl;
for (MyMap::insert_iterator it = mymap.ibegin(); it != mymap.iend(); ++it)
std::cout << (*(*it)).second << std::endl;
Of course, this mechanism breaks down once you start erasing elements from your map - the moment you do this, the accompanying iterators stored in the list will be invalidated! You could of course search for these elements and remove them from the list, but that would be very inefficient and might negate the efficiency that you gained from using a map in the first place.
In that case you might be better off to just use a list without a map, and sequentially search for the key when you want to retrieve a particular element. Note that you can use the std::find() methods to search for particular elements, you just have to provide a comparator that specifically compares the key. If you have a compiler that supports C++0x you might even use an unnamed lambda to provide the comparator instead of having to define a function object class.
|
|
|
|
|
Hello Friends
I am using drawImage from GDIPLUS in OnPaint().And Mine image is getting flickered too much.How can i reduce it?
Thanks & Regards
Yogesh
|
|
|
|
|
You may use double buffering technique. Have a look at (one of) the following CodeProject articles:
http://www.codeproject.com/info/search.aspx?artkw=double+buffering&sbo=kw[^].
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
+1 for using the CP search instead of google!
Watched code never compiles.
|
|
|
|
|
Thanks.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|