|
That's because you made it a type child, which means embedded in it's parent as opposed to a seperate dialog box. The suggestion you got was idiotic - it creates a modeless dialog and assumes it deletes itself ( because it's a pointer it won't die when it goes out of scope, nor do you have the address to interact with it or clean it up )
Christian
After all, there's nothing wrong with an elite as long as I'm allowed to be part of it!! - Mike Burston Oct 23, 2001
|
|
|
|
|
I have dynamically linked MFC DLL. This dll works fine under my VC++ project but there is a problem when I'm trying to use it with Delphi app. All functions work fine except one (and only one) that use MFC. Here is the code:
DLL_EXPORT BOOL Configure(HWND hWnd) {
int iRes;
COptionsDlg dlg;
HINSTANCE h = (HINSTANCE)::GetModuleHandle("briz2.dll");
ASSERT(h);
HINSTANCE hPrevious = AfxGetResourceHandle();
AfxSetResourceHandle(h);
dlg.DoModal();
AfxSetResourceHandle(hPrevious);
return (iRes == IDOK);
}
Linkage and calling are fine. It crashes at DoModal(). It's seems like dlg isn't created.
Does anyone know the solution? (I don't wanna use API calls like DialogBox...;P)
Nev
|
|
|
|
|
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
|
|
|
|
|