|
Ah, it doesn't show up for no reason. It shows up when resizing and during that resizing operation the column width is momentarily bigger that the size of the window BEFORE its adjusted.
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
Joe Woodbury wrote: Ah, it doesn't show up for no reason. It shows up when resizing and during that resizing operation the column width is momentarily bigger that the size of the window BEFORE its adjusted.
That's not spurious So, to get me on the same page (apparently I'm not even in the
right book), do you want the scrollbar to not show while it's resizing or do you want the
scrollbar to go away when the resize is finished or both?
|
|
|
|
|
It's spurious in that what I am doing should mean it never shows up. It's also spurious in that when it shows up, clicking on it makes it go away. Even more curious, it doesn't always use XP themes when it shows up. (I'm fairly sure this is a subtle bug in the common control library; I do know it's been around for quite a while, it's just that the nature of my current app makes it especially annoying.)
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
OK, with the following code I never see any horizontal scrollbar (Windows XP Pro, SP2).
This is a simple dialog with only a listview control - nothing else. Border is resizing.
I used a dialog because it was quick to toss together in VC++.
#include "stdafx.h"
#include "MFCTester.h"
#include "TestListViewDialog.h"
#include ".\testlistviewdialog.h"
IMPLEMENT_DYNAMIC(CTestListViewDialog, CDialog)
CTestListViewDialog::CTestListViewDialog(CWnd* pParent )
: CDialog(CTestListViewDialog::IDD, pParent)
{
}
CTestListViewDialog::~CTestListViewDialog()
{
}
void CTestListViewDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, m_ListCtrl);
}
BEGIN_MESSAGE_MAP(CTestListViewDialog, CDialog)
ON_WM_SIZING()
ON_WM_SIZE()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
BOOL CTestListViewDialog::OnInitDialog()
{
CDialog::OnInitDialog();
UpdateData(FALSE);
m_ListCtrl.InsertColumn(0, _T("Column 1"));
m_ListCtrl.InsertColumn(1, _T("Column 2"));
m_ListCtrl.SetExtendedStyle(m_ListCtrl.GetExtendedStyle() | LVS_EX_GRIDLINES);
FitListViewToDialog();
return TRUE;
}
void CTestListViewDialog::OnSizing(UINT fwSide, LPRECT pRect)
{
CDialog::OnSizing(fwSide, pRect);
if (pRect->right - pRect->left < 320)
pRect->right = pRect->left + 320;
if (pRect->bottom - pRect->top < 240)
pRect->bottom = pRect->top + 240;
}
void CTestListViewDialog::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (cx > 0 && cy > 0)
{
FitListViewToDialog();
}
}
void CTestListViewDialog::FitListViewToDialog()
{
if (::IsWindow(m_ListCtrl))
{
CRect ClientRect;
GetClientRect(&ClientRect);
m_ListCtrl.MoveWindow(0, 0, ClientRect.Width(), ClientRect.Height(), TRUE);
m_ListCtrl.SetColumnWidth(0, ClientRect.Width() / 2);
m_ListCtrl.SetColumnWidth(1, LVSCW_AUTOSIZE_USEHEADER);
}
}
BOOL CTestListViewDialog::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
-- modified at 19:29 Sunday 28th January, 2007
Added OnEraseBkgnd()
Added gridlines to check for flicker
-- modified at 19:38 Sunday 28th January, 2007
|
|
|
|
|
Here's the header file if you want to try it
#pragma once
#include "afxcmn.h"
class CTestListViewDialog : public CDialog
{
DECLARE_DYNAMIC(CTestListViewDialog)
public:
CTestListViewDialog(CWnd* pParent = NULL);
virtual ~CTestListViewDialog();
enum { IDD = IDD_DIALOG1 };
protected:
virtual void DoDataExchange(CDataExchange* pDX);
void FitListViewToDialog();
DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnInitDialog();
afx_msg void OnSizing(UINT fwSide, LPRECT pRect);
afx_msg void OnSize(UINT nType, int cx, int cy);
CListCtrl m_ListCtrl;
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
};
|
|
|
|
|
I ran your code. I still got horizontal bar flashing, but the bar didn't stick around. My code was very similar, with one key difference (which you had warned me about and I had dismissed); I was changing the column size inside OnSize() of my subclassed CListCtrl.
Thanks for your help.
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
I probably missed this in previous posts, but what version OS are you on? What version
is your common controls DLL?
Just for my own reference - I've gone to great lengths over the years to provide flicker-free
smooth non-spurious-crap UI so I'd like to know what other platforms to test on.
Thanks!
Mark
|
|
|
|
|
XP SP2 on both systems I've been working on.
comctl32.dll file version is 5.82.2900.2982
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
hmm same here.
The only way I can get the scrollbar to appear is if I force it by "incorrectly" calculating
column sizes (ie making the width of all columns greater than the control width).
Sorry I couldn't help
Mark
|
|
|
|
|
Mark Salsbery wrote:
The only way I can get the scrollbar to appear is if I force it by "incorrectly" calculating
column sizes (ie making the width of all columns greater than the control width).
Again, to clarify. With your help, I solved the problem of the horizontal scrollbar that stuck around until you clicked it. What I'm still seeing (and have observed this for years with other projects) is the horizontal scroll bar flashing when you resize a dialog smaller very quickly. Moving the OnSize response to the parent reduced this but didn't get rid of it entirely--since most users won't be doing this, it's not a great concern.
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
Joe Woodbury wrote: What I'm still seeing (and have observed this for years with other projects) is the horizontal scroll bar flashing when you resize a dialog smaller very quickly.
Right. I'm with ya. I just can't make it happen I just tried it on that test code again.
Are you absolutely sure you're (intentionally or not) not redrawing the control before
resizing the columns - even in a seemingly unrelated message handler somewhere? That's still
the only way I could see that happening.
|
|
|
|
|
Mark Salsbery wrote: Are you absolutely sure you're (intentionally or not) not redrawing the control before
resizing the columns - even in a seemingly unrelated message handler somewhere?
No. I even got it to happen with your code from yesterday.
Anyone who thinks he has a better idea of what's good for people than people do is a swine.
- P.J. O'Rourke
|
|
|
|
|
Bummer. I'm obsessive about little crap like that. It even drives me nuts that YOU haven't
solved it
Good luck!
|
|
|
|
|
How can I send text out to a List control in a loop?
for(int i=0; i<10; i++)
{
Sleep(1000);
m_list.AddString("Hello");
}
Now when im in the loop I dont see the text updateing but when the loop is finish then all the text is shown. How can I make so I can see the test updateing at ones?
|
|
|
|
|
A call to Sleep() isn't required, unless you want to convey the illusion of "progress". Try this:
for (int i=0; (i < 10); i++) {
Sleep (1000);
int nIndex = m_listCtrl.InsertItem (i, "Hello");
m_listCtrl.EnsureVisible (nIndex, TRUE);
m_listCtrl.UpdateWindow();
}
/ravi
|
|
|
|
|
I dont have 'InsertItem' only InserString or AddString.
|
|
|
|
|
Larsson wrote: I dont have 'InsertItem' only InserString or AddString.
Then you don't have a list control. You're probably using a CListBox and will need to use SetTopIndex() [^] instead
/ravi
|
|
|
|
|
|
Right. See my earlier reply.
/ravi
|
|
|
|
|
Is there any way i can display text boxes using the win32 api. I know i can display shapes and text using the gdi.dll libraries, but had no luck finding out how to display text boxes. Any help is welcome, thnkx
|
|
|
|
|
you can use CreateWindow to create a text box (or any other control you want)
|
|
|
|
|
You can use of ::CreateWindowA("EDITBOX",...);
|
|
|
|
|
I'm in desperate need of some help, this problem is way beyond my understanding and knowledge .. but if someone can point me in the right direction, I'd love to figure this out.
It started with a need for java.util.zip.ZipInputStream functionality in an activeX control (not .net based).
Instead of writing it from scratch using zlib, I found an old utility called ZIPIOS++ (which is nearly a port of the java class) . Got it, compiled it, wrote a small test program and when I compile/link it, I get 7 unresolved externals from the library... The func. declarations all appear to match, using dumpbin the externals appear to be in the lib. I've tried under VC 6 and VC 8.
Here is one example of the header object of one of the unresolved externals and the linker message.
Link to header file: http://zipios.cvs.sourceforge.net/zipios/zipios/zipios%2B%2B/zipfile.h?view=markup[^]
Link to Source file: http://zipios.cvs.sourceforge.net/zipios/zipios/src/zipfile.cpp?view=markup&sortdir=down[^]
3 relevant unresolved externals from the above source:
jim_test.obj : error LNK2001: unresolved external symbol "public: __thiscall zipios::ZipFile::ZipFile(class std::basic_string<char,struct std::char_traits<char="">,class std::allocator<char> > const &,int,int)" (??0ZipFile@zipios@@QAE@ABV?$basic_string
jim_test.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall zipios::ZipFile::~ZipFile(void)" (??1ZipFile@zipios@@UAE@XZ)
jim_test.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_istream<char,struct std::char_traits<char=""> > * __thiscall zipios::ZipFile::getInputStream(class zipios::SimpleSmartPointer<class zipios::fileentry="" const=""> con
st &)" (?getInputStream@ZipFile@zipios@@UAEPAV?$basic_istream@DU?$char_traits@D@std@@@std@@ABV?$SimpleSmartPointer@$$CBVFileEntry@zipios@@@2@@Z)
|
|
|
|
|
Maybe I'm way off, but my first thought is that the classes in the DLL aren't exported.
What if you do something like the AFX_EXT_CLASS macro in MFC.
Add something like this to your precompiled header or someplace before every .h file is
compiled:
#if !defined(ZIPIOS_IMP_EXP)
#if defined(ZIPIOS_DLL_BUILD)
#define ZIPIOS_IMP_EXP __declspec(dllexport)
#else
#define ZIPIOS_IMP_EXP __declspec(dllimport)
#endif
#endif
In the zipios source, change the class declarations from
class ZipFile : public FileCollection {
...
to
class ZIPIOS_IMP_EXP ZipFile : public FileCollection {
...
(base classes need to be exported as well)
Define ZIPIOS_DLL_BUILD when building the dll and don't define it when building the app.
Mark
|
|
|
|
|
In Dev-C++, I'm compiling a script, and whenever I run the program that's compiled, a file called gmon.out gets outputted. Is it important? If not, how do I make the compiler not create the file while compiling?
(I'm using Dev-C++)
|
|
|
|