|
hi everyone,
I know, I already asked about that topic, but I still can't get it to work.
the problem was that i want the dialog opened by SHBrowseForFolder() to get opened on a specified folder.
here is the code i wrote :
void CFileRenamerDlg::OnBrowseFolder()
{
CoInitialize(NULL);
char folderBuf[MAX_PATH];
LPITEMIDLIST pidl = NULL;
BROWSEINFO bi;
bi.hwndOwner = this->GetSafeHwnd();
bi.pidlRoot = pidl;
bi.pszDisplayName = folderBuf;
bi.lpszTitle = _T("Select the folder where your files are located in...");
bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS | BIF_SHAREABLE;
bi.lpfn = NULL;
pidl = SHBrowseForFolder(&bi);
if (pidl != NULL) {
SHGetPathFromIDList(pidl, folderBuf);
m_Directory.SetWindowText(folderBuf);
m_strFolder = folderBuf;
}
}
for your information, m_strFolder is declared as a CString .
this compiles fine, but always starts on the desktop. if I uncomment what is commented, the compiler (VC7.1) complains about the A2W() macro (actually, not directly the macro, but the "variables" used within).
did anybody already encountered this ?
can anyone suggest a better way (if any) to get SHBrowseForFolder() to get opened on a specified folder ?
thanks in advance.
|
|
|
|
|
super_ttd wrote: [...] the compiler (VC7.1) complains about the A2W() macro [...]
Try the newer improved CA2W macro. Actually I think you need CT2W macro. The correct shortest usage:
::SHParseDisplayName(CT2W(m_strFolder), . . .
Then try the rest of the code again. I hope this helps.
|
|
|
|
|
thanks for you answer. however, I have to add some more details.
actually, my A2W() was a mistake when I posted the message. I actually used T2W(), but not CT2W() because SHParseDisplayName() waits for a LPWSTR.
hum, not i'm checking the msdn and it tells me a LPCWSTR, but intellisense was telling LPWSTR. which to believe, and how to solve that ?
|
|
|
|
|
Since SHParseDisplayName requires LPCWSTR , the proposed solution should work:
::SHParseDisplayName(CT2W(m_strFolder), . . .);
|
|
|
|
|
yup, I think so (but i have no compiler for the moment, so I'll give you feedback tomorrow when I test it at home.
By the way, why does intellisense tell me SHParseDisplayName() wants a LPWSTR then ?
|
|
|
|
|
super_ttd wrote: why does intellisense tell me SHParseDisplayName() wants a LPWSTR then ?
I cannot explain this. In my case it tells me that the first parameter is of PCWSTR type.
|
|
|
|
|
super_ttd wrote: ...why does intellisense tell me SHParseDisplayName() wants a LPWSTR then ?
Because that is the way the function is defined.
|
|
|
|
|
did you read the other posts of the thread ?
boths ways are how the function is defined ! the problem is one is the doc online, and the other is what i'm using in my code.
|
|
|
|
|
super_ttd wrote: boths ways are how the function is defined
My point is as far as the compiler knows, at the point of the call there is only 1 definition.
Are you sure you didn't see LPCWSTR with intellisense? Same thing as PCWSTR.
I can't find any old reference (in header files) to SHParseDisplayName() taking anything but
a const WCHAR * as the first argument. The L part of the macro is a holdover from Win16 days.
|
|
|
|
|
hello Viorel,
then i tried your sample, and it does compile.
but the behavior is not the one expected.
actually, it does open the "browse for folder" dialogBox, but the folder in m_strFolder is drawn as the root folder.
what i wanted to have is still have the desktop folder as the root (exactly as if pidl was set to NULL), but with m_strFolder folder selected (the tree expanded to that folder).
another weird thing is that SHParseDisplayName() is available only since WindowsXP. wasn't it possible to have such a behavior on Windows 2000 ?!
thanks for your contribution... see you
|
|
|
|
|
Hello Comunity,
i use this funktion to show items in an CListCtrl with diferent colors, and i need to know
which item number is to be drawn.
I try to cast pNMHDR to
LPNMLVCUSTOMDRAW pLVCD = (LPNMLVCUSTOMDRAW)pNMHDR;
but i need to know the itemnumber who is to drawn...
any one have some sugestions for me?
thaks
break;
|
|
|
|
|
If no other solution, I think you can store the item number as a private data:
lvItem.mask = ... | LVIF_PARAM;
. . .
lvItem.lParam = (LPARAM)i;
pMatrixListResults->InsertItem(&lvItem);
Later obtain this number from the NMCUSTOMDRAW structure:
LPNMLVCUSTOMDRAW pLVCD = (LPNMLVCUSTOMDRAW)pNMHDR;
int number = (int)pLVCD->nmcd.lItemlParam;
I hope this works.
|
|
|
|
|
Hello,
yes, your idea works perfect, this is what i use now!
Thank you!
break;
|
|
|
|
|
Why don't you use OnDrawItem ?
|
|
|
|
|
Hello Capallini,
i never use this method, maybe i should try this..
regards
break;
|
|
|
|
|
LPNMLVCUSTOMDRAW pLVCD = (LPNMLVCUSTOMDRAW)pNMHDR;
int nItem = (int) pLVCD->nmcd.dwItemSpec;
|
|
|
|
|
ups,
yes, you right, i use this before in my previous project, thanks... :->
regards
break;
|
|
|
|
|
Hi all,
I have a combo-box consisting of 30 elements.
I want the elements from 1-12 enabled , and the rest(13-30) disabled
and also once the user selects the disbaled items , the combo box should take care
of not selecting the options
How could I do this ..
Regards,
Veeresh
|
|
|
|
|
Veeresh Hiremath wrote: I have a combo-box consisting of 30 elements.
I want the elements from 1-12 enabled , and the rest(13-30) disabled
I doubt if this is possible. I don't think you could disable specific items in a CComboBox.
Veeresh Hiremath wrote: How could I do this ..
List only what is valid.
Nobody can give you wiser advice than yourself. - Cicero
|
|
|
|
|
Veeresh Hiremath wrote: I want the elements from 1-12 enabled , and the rest(13-30) disabled
you have to subclass the CComboBox for same.. subclassing is the key to this type of effect
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
Support CRY- Child Relief and you
|
|
|
|
|
there's an article here on CP that does that.
here it is[^]
|
|
|
|
|
Hi all,
I have an application written in Visual C++6.0 which uses a Rich Edit Control to display user chat. I want to implement text highlighting as in MS Word for this rich edit control so that I can highlight messages from particular players.
I am using CHARFORMAT structure for formatting text. Can someone help me implementing this?
I tried using CHARFORMAT2 which has text BackColor property but it didnt help.
Thanking in anticipation
Sachin Bhave
|
|
|
|
|
CHARFORMAT2 cf;
memset(&cf, 0, sizeof(CHARFORMAT2));
cf.cbSize = sizeof(CHARFORMAT2);
cf.dwMask = CFM_BOLD;
cf.dwEffects = CFE_BOLD;
COLORREF clr =RGB(255, 10, 15) ;
cf.dwMask =CFM_COLOR;
//cf.dwEffects = CFE_AUTOCOLOR; // Bold
cf.crTextColor = clr;
|
|
|
|
|
Hello All,
I have small and simple COM program to access a Add function in Dll and I am accessing this function from main program. For the simple add function it is working, interface and dll files are working properly.
For this interface I am trying to add one more function by name getdate() which of return Char* .. can any one please help how to declare the getdate() function in interface ???
Below are declaration and files with there names ….
// File interface.h
// This file contains interface related declarations.
#ifndef _A_INTERFACE_H_
#define _A_INTERFACE_H_
DECLARE_INTERFACE_(IMyA,IUnknown)
{
STDMETHOD_(LONG,MyAdd)(INT,INT) PURE;
};
--- ---
--- ---
file :- MyA.h
class CMyA : public CCmdTarget
{
DECLARE_DYNCREATE(CMyA)
CMyA();
-- -- -- - - -- -- -- - -
-- -- -- - - -- -- -- - -
-- -- - -
-- -- - --- -- -- - --- -- -- - -
protected:
virtual ~CMyA();
DECLARE_MESSAGE_MAP()
BEGIN_INTERFACE_PART(MyAObj,IMyA)
STDMETHOD_(LONG,MyAdd) (INT,INT);
END_INTERFACE_PART(MyAObj)
DECLARE_INTERFACE_MAP()
DECLARE_OLECREATE(CMyA)
};
// MyA.cpp : implementation file
-- -- -- --- -- --
//IMyA Functions
STDMETHODIMP_ (LONG)
CMyA::XMyAObj::MyAdd (INT x,INT y)
{
return (x+y);
}
-------------------------------
// function to be added to Interface can u please help me how to declare this function in interface.
char* getDate()
{
struct tm *newtime;
char am_pm[] = "AM";
-- - - -
--- - -- - - -
}
Thanking you,
Suresh H
|
|
|
|
|
From the macros you're using I guess you implement the server using ATL.
Use the class wizard to add your new interface method: right click on the interface in the class view and select "Add method..." or something like that.
Hope this helps
--
Roger
"It's supposed to be hard, otherwise anybody could do it!" - selfquote
"No one remembers a coward!" - Jan Elfström 1998 "...but everyone remembers an idiot!" - my lawyer 2005 when heard of Jan's saying above
|
|
|
|