• 全部
  • Windows SDK/API
  • 基础类
  • ActiveX
  • 数据库及相关技术
  • 网络及通讯开发
  • VCL组件使用和开发
  • 问答

小难题!!!!!

COKING 2003-01-12 12:05:17
怎么在SaveDialog没选定文件的时候,按《确定》键把它关掉?
...全文
15 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
COKING 2003-01-13
ok!!!!谢了!!!!@_@
回复
「已注销」 2003-01-12
您预先写一个默认的filename 如“未命名”(当然 您得取一个再蹊跷点的 如 @未命名)

这样就可以支持“确定”了

你发现还是“未命名”

那么你就可以判断用户没有选中了

回复
Friecin 2003-01-12
SaveDialog是封装WinAPI标准对话框的,如果你想这么做,就需要直接调用API函数,来进行调整:
int DialogBoxParam(HINSTANCE hinstance,LPCTSTR lpTemplateName,HWND hWndParent,DLGPROC lp DialogFunc,LPARAM dwInitParam);

具体我没有试验过。

还有,说说你的意图,也许可以用其他方式解决实际问题。
回复
s98231106 2003-01-12

不知道
回复
jishiping 2003-01-12
不知道楼主为什么要这样做?是不是想让用户选择一个目录啊?如果这样的话,可以使用
BCB的函数SelectDirectory就可以了。
bool __fastcall SelectDirectory(const AnsiString Caption, const WideString Root,
AnsiString &Directory);
回复
jishiping 2003-01-12
用API写可以,但是用BCB的控件就不行了。
回复
warton 2003-01-12

如果filename不为空,就可以了
回复
l_clove 2003-01-12
SaveDialog在没选定的时候,filename不是""么,判断一下就可以了吧
回复
jishiping 2003-01-12
这个方法,对于SaveDialog一样使用,因为"保存"和“打开”按钮的ID是一样的,都是IDOK,也就是1。
回复
jishiping 2003-01-12
我开始也是这么写的,可是不行啊,后来就改用钩子了。Windows可能做了什么手脚吧,至于是什么手脚,我就没有去研究了(估计是钩子方面的)。另外我举个例子,MessageBox这个函数,大家都不陌生。可是你用FindWindowEx,却怎么也找不到MessageBox这个窗口。用钩子才可以找到这个窗口句柄。
回复
COKING 2003-01-12
再问一下,JSP大哥,下面的代码为什么不可以呀!!!你的代码SaveDialog可以吗?
FARPROC OldProc;
LRESULT CALLBACK MyProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM Param)
{
if(uMsg==WM_COMMAND&&wParam==ID_OK)
return MessageBox(0,"aaaa","bbbb",MB_OK);
else
return CallWindowProc(OldProc,hwnd,uMsg,wParam,Param);
}
//----------------------------------------------------------------
void __fastcall TForm1::SaveDialog1Show(TObject *Sender)
{
(long)OldProc=SetWindowLong(SaveDialog1->Handle,GWL_WNDPROC,(long)MyProc);
}

回复
halibut 2003-01-12
要只是想选取目录,用SelectDirectory()函数就行啊!
回复
jishiping 2003-01-12
在执行完OpenDialog1->Execute()后,用ExtractFileDir(OpenDialog1->FileName)就得到选择的目录了。
回复
jishiping 2003-01-12
下面的代码就可以了,但是需要注意,OpenDialog1的属性ofFileMustExist
必须为false才可以。

static HWND hOkWnd = NULL;
static HHOOK hHook = NULL;
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0)
return CallNextHookEx(hHook, nCode, wParam, lParam);
MOUSEHOOKSTRUCT* pmhs = (MOUSEHOOKSTRUCT*)lParam;
if (wParam==WM_LBUTTONUP && pmhs->hwnd==hOkWnd) {
SendMessage(GetParent(hOkWnd), CDM_SETCONTROLTEXT,
edt1, (long)"(None)");
}
return 0;
}

//OpenDialog1的OnShow事件
void __fastcall TForm1::OpenDialog1Show(TObject *Sender)
{
hOkWnd = GetDlgItem(GetParent(OpenDialog1->Handle), IDOK);
hHook = SetWindowsHookEx(WH_MOUSE, (FARPROC)MouseProc,
NULL, GetCurrentThreadId());
}

//OpenDialog1的OnClose事件
void __fastcall TForm1::OpenDialog1Close(TObject *Sender)
{
if (hHook!=NULL) UnhookWindowsHookEx(hHook);
}
回复
大大怪老张 2003-01-12
用jsp提供的函数来选择目录就好了。
回复
COKING 2003-01-12
我确实要选目录的!
我用SetWindowLong 替换了对话框的WND_PROC后。来处理WM_COMMAND消息,
居然在点<确定>时,WM_COMMAND它是不触发的,而其他消息都能抓到的。
《确定》的ID 为ID_OK,
《取消》的ID 为ID_CANCEL,
这些我知道的。在点《确定》时处理。我要处理的。。。
回复
相关推荐
发帖
C++ Builder
创建于2007-08-02

1.3w+

社区成员

C++ Builder相关内容讨论区
申请成为版主
帖子事件
创建了帖子
2003-01-12 12:05
社区公告
暂无公告