|
Add this as the first line in the function:
AFX_MANAGE_STATE(AfxGetStaticModuleState());
Look up the technical note on AFX_MANAGE_STATE for more details.
--Mike--
http://home.inreach.com/mdunn/
#include "witty_sig.h"
your with and
|
|
|
|
|
Works! Thank you!
Nev
|
|
|
|
|
Hello,
I am planning to write a program that can record a sound from the mic.
I have no idee where to begin, what to learn, ... no idea! This mean any help/suggestion is welcome.
I thank you in advance.
Where there is a WISH, there is a WILL.
|
|
|
|
|
Maybe try Microsoft Speech SDK?
|
|
|
|
|
I am using this and have 4 columns set up number 0-3. I have tried using SetItem with an LVITEM but for some reason it isn't working. Can anyone help?
-Matt Newman
-Matt Newman
|
|
|
|
|
|
m_ctlLVDirs.InsertColumn(0, _T("Alias"), LVCFMT_LEFT, 138, 0);
m_ctlLVDirs.InsertColumn(1, _T("Directory"), LVCFMT_LEFT, 160, 1);
m_ctlLVDirs.InsertColumn(2, _T("Default File"), LVCFMT_LEFT, 80, 2);
m_ctlLVDirs.InsertColumn(3, _T("Listing"), LVCFMT_LEFT, 60, 3);
m_ctlLVDirs.SetExtendedStyle(LVS_EX_CHECKBOXES | LVS_EX_INFOTIP | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP);
LVITEM lvi;
CString strItem;
int i = 0;
for(i=0; i<10; i++)
{
int l;
l = i + 1;
lvi.mask = LVIF_TEXT;
lvi.iItem = i;
lvi.iSubItem = 0;
strItem.Format(_T("Alias %i"), l);
lvi.pszText = (LPTSTR)(LPCTSTR)(strItem);
m_ctlLVDirs.InsertItem(&lvi);
lvi.iSubItem = 1;
strItem.Format(_T("Dir %i"), l);
lvi.pszText = (LPTSTR)(LPCTSTR)(strItem);
m_ctlLVDirs.SetItem(&lvi);
strItem.Format(_T("Dir %i"), l);
m_ctlLVDirs.SetItemText(i, 1, _T("Dir"));
strItem.Format(_T("Default %i"), l);
m_ctlLVDirs.SetItemText(i, 2, _T("Default"));
strItem.Format(_T("Default %i"), l);
m_ctlLVDirs.SetItemText(i, 3, _T("FALSE"));
}
-Matt Newman
-Matt Newman
|
|
|
|
|
Matt Newman wrote:
l = i + 1;
This is your problem. The index is 0 based; the insertion method works correctly, but inserts it at position i rather than i+1. Then, the rest of the code attempts to modify item i+1 which doesn't exist.
To fix this, you can either adjust your code to use i instead of i+1, or you can use the return value of InsertItem() which is the index the item was actually inserted at.
|
|
|
|
|
Hi Matt,
I think Shog9 may have missed that you only use the variable 'l' for string formatting.
I think the SetItem here is working, the only problem is that you completely nuke the change after you've done it. You perform a SetItem on subitem 1 to set subitem 1's text to 'Dir 7', for example. Two statements on, you then set subitem 1's text to the constant string _T("Dir"). Is this what you were having a problem with? I removed the two lines:
strItem.Format(_T("Dir %i"), l);
m_ctlLVDirs.SetItemText(i, 1, _T("Dir"));
and got a list where column 1 had "Dir 1", "Dir 2" etc...
Is this what you were after?
------------------------
Derek Waters
derek@lj-oz.com
|
|
|
|
|
Are columns zero based? I had set them up zero-based so the were 0,1,2,3 and the first column would show but none of the other three. I changed it to 1,2,3,4 in all it still won't show the 2,3,4 columns.
-Matt Newman
-Matt Newman
|
|
|
|
|
What do you mean by won't show? Are the columns there? Are the fields empty?
I cut and pasted your code into a sample project and I had text in all four columns (they are 0-based), although the text for columns 1,2,3 didn't have numbers in them, just the words "Dir", "FALSE" etc.
I just thought of something - you do have the list defined as "LVS_REPORT" style and not "LVS_LIST" don't you?
------------------------
Derek Waters
derek@lj-oz.com
|
|
|
|
|
All the columns show but there isn't anything in them. And it is set as report.
-Matt Newman
-Matt Newman
|
|
|
|
|
Hmm, the only thing I can think of is that you use the return value from InsertItem in your subsequent calls:
int viInsertedAt = InsertItem(&tvi);
if (viInsertedAt != -1)
{
m_ctrlList.SetItemText(viInsertedAt, 1, _T("Dir"));
m_ctrlList.SetItemText(viInsertedAt, 2, _T("XXX"));
m_ctrlList.SetItemText(viInsertedAt, 3, _T("FALSE"));
}
viInsertedAt might not be equal to i if you have sorting or something else turned on? As I said, this code seemed to work fine for me.
------------------------
Derek Waters
derek@lj-oz.com
|
|
|
|
|
Derek Waters wrote:
int viInsertedAt = InsertItem(&tvi);if (viInsertedAt != -1){ m_ctrlList.SetItemText(viInsertedAt, 1, _T("Dir")); m_ctrlList.SetItemText(viInsertedAt, 2, _T("XXX")); m_ctrlList.SetItemText(viInsertedAt, 3, _T("FALSE"));}
I tried this and put a message box if it made it there and what number it was on and it went 0 through nine but nothing. I am totally lost.
-Matt Newman
-Matt Newman
|
|
|
|
|
What did SetItemText return?
------------------------
Derek Waters
derek@lj-oz.com
|
|
|
|
|
False
-Matt Newman
-Matt Newman
|
|
|
|
|
Right, I'm stumped. Do you want to send me your code?
------------------------
Derek Waters
derek@lj-oz.com
|
|
|
|
|
I will email you the whole project tommorrow. It about 160 KB compressed. I need to sleep now.
-Matt Newman
-Matt Newman
|
|
|
|
|
Stupid me. I was calling the function to fill the control before I declared the columns. Now it works. Thanks for trying to help.
-Matt Newman
-Matt Newman
|
|
|
|
|
(Using WTL)
How can I put multiple template params (>1) in a macro definition?
I've been using CHAIN_MSG_MAP() to pass messages to templatized base classes with ease for quite a while now. But today I decided to get a little fancy & in turn break things horribly.
Take the following as an example, the first CHAIN_MSG_MAP works, but why does the second cause a host of compiler errors?
If I use a typedef of the multiple param base class, all will work - but why? There has got to be a method that feels less like a hack.
////////////
template <class T>
class CWorks
{
public:
BEGIN_MSG_MAP(CWorks)
END_MSG_MAP()
};
template <class T, BOOL bSomething>
class CBroken
{
public:
BEGIN_MSG_MAP(CBroken)
END_MSG_MAP()
};
class CMyWindow : public CWindowImpl<CMyWindow>,
public CWorks<CMyWindow>
public CBroken<CMyWindow, TRUE>
{
public:
BEGIN_MSG_MAP(CMyWindow)
CHAIN_MSG_MAP( CWorks<CMyWindow> )
CHAIN_MSG_MAP( CBroken<CMyWindow,TRUE> )
END_MSG_MAP()
};
|
|
|
|
|
CHAIN_MSG_MAP( CBroken<CMyWindow,TRUE> )
Use a typedef to get rid of the comma (which is the source of the problem).
typedef CBroken<CMyWindow,TRUE> theBrokenClass;
CHAIN_MSG_MAP( theBrokenClass )
--Mike--
http://home.inreach.com/mdunn/
#include "witty_sig.h"
your with and
|
|
|
|
|
Hi all!
I made a tree in my dialog. I successfully inserted a few nodes to the tree. The problems arise when I try to access the node that is being selected. I always get a NULL pointer when I try to get the handle to the selected node. Can any one tell me what I miss?
When I insert the nodes, I ignore the *hItem* entry. Is it the cause, if so , how do you fix this?
Here is what I did. I used 2 ways and they both give me a null pointer return:
void CMyDlg::OnClickTreeview(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
HTREEITEM hSelectedNode =
pNMTreeView->itemNew.hItem;
//get the handle to the selected node
if (!hSelectedNode)
AfxMessageBox("fail to get the handle");
else
AfxMessageBox("Get the handle OK");
}
//*****************************
another way is:
CTreeCtrl * pTree =
(CTreeCtrl*) GetDlgItem(IDC_TREE);
HTREEITEM hSelectedNode =
pTree->GetSelectedItem();
//*******************************
Thank You
Vu
vucsuf
|
|
|
|
|
Here's some bits for you.
Changed selection
void CExIncView::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
TVITEM ThisID;
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
//get itemID.
ThisID = pNMTreeView->itemNew;
//Some extra bits for you
GetTreePath();
SetFileList();
*pResult = 0;
}
Traverse tree creating a tree path string
void CExIncView::GetTreePath()
{
CString lString;
CString sTemp,sTemp2;
HTREEITEM lItem;
DWORD Code;
lItem = m_pDirTree.GetSelectedItem();
sTemp = m_pDirTree.GetItemText(lItem);
Code = m_pDirTree.GetItemData(lItem);
lString = sTemp;
while( (lItem=m_pDirTree.GetParentItem(lItem)) != NULL )
{
sTemp = m_pDirTree.GetItemText(lItem);
Code = m_pDirTree.GetItemData(lItem);
//can make use of the ItemData to trigger different
// code branches and pass some bit data
sTemp2 = lString;
lString.Format("%s\\%s",sTemp, sTemp2);
}
m_Filename = lString;
// UpdateData(FALSE);
}
Find a string item in my tree. Actually I nearly always keep tree data in a CList or one of its type,
seaches in a control with a lot of data can be slow for everyday use. Plus, you can store TV_ITEM objects
in your List as items are added so that you can search and then select you tree item very quickly.
This first function just shows a way to traverse. It calls a 2nd which finds the item by name
Only put this as a quick way to change my Clist search to a tree search
const int MAX_ITTERATIONS = 100;
void CExIncView::FindInTree(CString &sText)
{
bool Done = FALSE;
int j,Pos;
char *lTreeNames[MAX_ITTERATIONS];
CString lString;
//split the directory name into individual strings
for(j=0;j
|
|
|
|
|
Hi There!
Thank you for your help. The problem I have is different. I have a tree structure in the background. I then use SetItemData() to hook each node to a node in my backGround tree. When a node of CTreeCtrl is clicked, I display the coresponding node data in my backGround Tree. In the OnClick() event, I need to get the handle to the node that is selected. The problem I am having is that getSelectedItem() returns NULL at the beginning. After a few clicks, it seems to give me correct handle. I don't know if the search process is too slow or because the SetItemData screw me up. Do you have any clue?
Thanks
Vu
vucsuf
|
|
|
|
|
I suspect that you are trying to GetSelectedItem() actually between the change, there's a point at which none is selected.
You wrote the function as getSelectedItem(), are you doing this in java? You, you trator you (only joking man).
Anyway, check there is a selection first then with maybe a hit test.
We do it for the joy of seeing the users struggle.
|
|
|
|
|