小难题!!!!!

COKING 2003-01-12 12:05:17
怎么在SaveDialog没选定文件的时候,按《确定》键把它关掉?
...全文
38 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
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,
这些我知道的。在点《确定》时处理。我要处理的。。。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧