急急急!如何调出帮助。

sadpacific 2000-02-18 02:49:00
我想实现这个功能:当单击窗口右上角的Help按钮后,将鼠标移到窗口的某个控件上,单击,可以看到关于该控件的类似Hint式的帮助。
恳请各位高手指点。
...全文
242 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hml 2000-02-19
  • 打赏
  • 举报
回复
正查找方法
hubdog 2000-02-19
  • 打赏
  • 举报
回复
hehe,yijun2000
就是这个api,
WinHelp(yourwinhandle,'c:\hubdog\hubdog.hlp',HELP_CONTEXT,yourcontrolhelpcontext);
先赚点参与分再说:)
yijun2000 2000-02-19
  • 打赏
  • 举报
回复
hubdog的方法是对的,这样你就可以有一个现实问号的小按钮了,按一下,在相应的控件上就会显示帮助,当然这个控件得有帮助id。
如果你是需要直接显示帮助文件的内容、目录或是你指定的一段,就要调用一个winapi函数了,反正delphi都帮你申明好了,直接用,一下子想不起来,要的话,再告诉你。
hubdog 2000-02-19
  • 打赏
  • 举报
回复
太简单了,设定form.borderstyle:=bsdialog,//必须是dialog才行
form.bordericons:=[bisystemmenu,bihelp];
oncreate里
application.helpfile:='c:\hubdog\hubdog.hlp';
设定每一个控件的helpcontext正确值,
然后运行,就ok了。

thinking_man 2000-02-19
  • 打赏
  • 举报
回复
一个笨办法:
先给每个控件的hint属性赋值,在单击按纽后,将每个按纽的showhint:=true,是否可行呢?
Firing_Sky 2000-02-18
  • 打赏
  • 举报
回复
用TAction就可以实现啊!
bbsboyy 2000-02-18
  • 打赏
  • 举报
回复
关注!
WHQ 2000-02-18
  • 打赏
  • 举报
回复
帮助ID是指每一个帮助主题的K脚注值
Dephi我不懂,给一段C的SDK的例子吧
/****************************************************************************

PROGRAM: HelpEx.c

Copyright (c) 1991, 1992 Borland International, Inc.

PURPOSE: Illustrates calls to WinHelp and context-sensitive help.
HelpEx loads library MenuHook, which detects F1 keystrokes in
the HelpEx application menus.

FUNCTIONS:

WinMain() - Calls initialization function, processes message loop.
InitApplication() - Initializes window data and registers window class.
InitInstance() - Saves instance handle and creates main window.
MainWndProc() - Processes window messages.
About() - Processes messages for "About" dialog box.
MakeHelpPathName() - Derives path name of help file.

****************************************************************************/

#define STRICT
#include <windows.h>
#pragma hdrstop
#include "helpex.h"
#include "helpids.h"
#include <windowsx.h>

HWND hWnd; /* Handle to main window */
HINSTANCE hInst; /* Handle to instance data*/
BOOL bHelp = FALSE; /* Help mode flag; TRUE = "ON"*/
HCURSOR hHelpCursor; /* Cursor displayed when in help mode*/
char szHelpFileName[EXE_NAME_MAX_SIZE+1]; /* Help file name*/
HACCEL hAccTable; /* handle to accelerator table */

void MakeHelpPathName(char*); /* Function deriving help file path */


/****************************************************************************

FUNCTION: WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

PURPOSE: Calls initialization function, processes message loop.

****************************************************************************/
#pragma argsused

int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;

if (!hPrevInstance)
if (!InitApplication(hInstance))
return (FALSE);

if (!InitInstance(hInstance, nCmdShow))
return (FALSE);

while (GetMessage(&msg, NULL, 0, 0)) {

/* Only translate message if it is not an accelerator message */
if (!TranslateAccelerator(hWnd, hAccTable, &msg)) {

TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (msg.wParam);
}


/****************************************************************************

FUNCTION: InitApplication(HINSTANCE)

PURPOSE: Initializes window data and registers window class.

RETURNS: Status of RegisterClass() call.

****************************************************************************/

BOOL InitApplication(HINSTANCE hInstance)
{
WNDCLASS wc;

wc.style = 0;
wc.lpfnWndProc = MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = GetStockObject(WHITE_BRUSH);
wc.lpszMenuName ="HelpexMenu";
wc.lpszClassName = "HelpexWClass";

return (RegisterClass(&wc));
}


/****************************************************************************

FUNCTION: InitInstance(HINSTANCE, int)

PURPOSE: Saves instance handle in global variable and creates main
window.

RETURNS: Status of CreateWindow() call.

****************************************************************************/

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{

hInst = hInstance;

hAccTable = LoadAccelerators(hInst, "HelpexAcc");

hWnd = CreateWindow(
"HelpexWClass",
"Help Example ",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);

if (!hWnd)
return (FALSE);

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

EnableMenuItem(GetSubMenu(GetMenu(hWnd), 1), IDM_CLEAR, MF_ENABLED);

MakeHelpPathName(szHelpFileName);
hHelpCursor = LoadCursor(hInst,"HelpCursor");

return (TRUE);

}

/****************************************************************************

FUNCTION: MainWndProc(HWND, UINT, WORD, LONG)

PURPOSE: Processes window messages.

MESSAGES:

WM_COMMAND- Application menu item
WM_DESTROY- Destroy window

****************************************************************************/

LRESULT CALLBACK _export MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
DLGPROC lpProcAbout;
DWORD dwHelpContextId;

switch (message) {

case WM_COMMAND:
/* Was F1 just pressed in a menu, or are we in help mode */
/* (Shift-F1)? */

if (bHelp) {
UINT id = GET_WM_COMMAND_ID(wParam, lParam);

dwHelpContextId =
(id == IDM_NEW) ? (DWORD) HELPID_FILE_NEW :
(id == IDM_OPEN) ? (DWORD) HELPID_FILE_OPEN :
(id == IDM_SAVE) ? (DWORD) HELPID_FILE_SAVE :
(id == IDM_SAVEAS) ? (DWORD) HELPID_FILE_SAVE_AS :
(id == IDM_PRINT) ? (DWORD) HELPID_FILE_PRINT :
(id == IDM_EXIT) ? (DWORD) HELPID_FILE_EXIT :
(id == IDM_UNDO) ? (DWORD) HELPID_EDIT_UNDO :
(id == IDM_CUT) ? (DWORD) HELPID_EDIT_CUT :
(id == IDM_CLEAR) ? (DWORD) HELPID_EDIT_CLEAR :
(id == IDM_COPY) ? (DWORD) HELPID_EDIT_COPY :
(id == IDM_PASTE) ? (DWORD) HELPID_EDIT_PASTE :
(DWORD) 0L;

if (!dwHelpContextId)
{
MessageBox( hWnd, "Help not available for Help Menu item",
"Help Example", MB_OK );
return (DefWindowProc(hWnd, message, wParam, lParam));
}

bHelp = FALSE;
WinHelp(hWnd,szHelpFileName,HELP_CONTEXT,dwHelpContextId);
break;
}

switch (GET_WM_COMMAND_ID(wParam, lParam)) {
case IDM_NEW:
case IDM_OPEN:
case IDM_SAVE:
case IDM_SAVEAS:
case IDM_PRINT:
case IDM_UNDO:
case IDM_CUT:
case IDM_CLEAR:
case IDM_COPY:
case IDM_PASTE:
MessageBox(hWnd,
"Command not implemented",
"Help Example",
MB_OK);
break;

case IDM_EXIT:
DestroyWindow(hWnd);
break;

case IDM_HELP_INDEX:
WinHelp(hWnd,szHelpFileName,HELP_INDEX,0L);
break;

case IDM_HELP_KEYBOARD:
WinHelp(hWnd,szHelpFileName,HELP_KEY,(DWORD)(LPSTR)"keys");
break;

case IDM_HELP_HELP:
WinHelp(hWnd,"WINHELP.HLP",HELP_INDEX,0L);
break;

case IDM_ABOUT:
lpProcAbout = (DLGPROC)MakeProcInstance((FARPROC)About, hInst);
DialogBox(hInst,
"AboutBox",
hWnd,
lpProcAbout);

#ifndef __FLAT__
FreeProcInstance((FARPROC)lpProcAbout);
// required for 16-bit applications only
#endif

break;

default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}

break;

case WM_LBUTTONDOWN:
if (bHelp)
{
bHelp = FALSE;
WinHelp( hWnd, szHelpFileName, HELP_CONTEXT,
(DWORD) HELPID_EDIT_WINDOW );
break;
}

return (DefWindowProc(hWnd, message, wParam, lParam));

case WM_NCLBUTTONDOWN:
/* If we are in help mode (Shift-F1) then display context- */
/* sensitive help for non-client area. */

if (bHelp) {
dwHelpContextId =
(wParam == HTCAPTION) ? (DWORD) HELPID_TITLE_BAR :
(wParam == HTREDUCE) ? (DWORD) HELPID_MINIMIZE_ICON :
(wParam == HTZOOM) ? (DWORD) HELPID_MAXIMIZE_ICON :
(wParam == HTSYSMENU) ? (DWORD) HELPID_SYSTEM_MENU :
(wParam == HTBOTTOM) ? (DWORD) HELPID_SIZING_BORDER :
(wParam == HTBOTTOMLEFT) ? (DWORD) HELPID_SIZING_BORDER :
(wParam == HTBOTTOMRIGHT) ? (DWORD) HELPID_SIZING_BORDER :
(wParam == HTTOP) ? (DWORD) HELPID_SIZING_BORDER :
(wParam == HTLEFT) ? (DWORD) HELPID_SIZING_BORDER :
(wParam == HTRIGHT) ? (DWORD) HELPID_SIZING_BORDER :
(wParam == HTTOPLEFT) ? (DWORD) HELPID_SIZING_BORDER :
(wParam == HTTOPRIGHT) ? (DWORD) HELPID_SIZING_BORDER :
(DWORD) 0L;

if (!((BOOL)dwHelpContextId))
return (DefWindowProc(hWnd, message, wParam, lParam));

bHelp = FALSE;
WinHelp(hWnd,szHelpFileName,HELP_CONTEXT,dwHelpContextId);
break;
}

return (DefWindowProc(hWnd, message, wParam, lParam));

case WM_KEYDOWN:
if (wParam == VK_F1) {

/* If Shift-F1, turn help mode on and set help cursor */

if (GetKeyState(VK_SHIFT)<0) {
bHelp = TRUE;
SetCursor(hHelpCursor);
return (DefWindowProc(hWnd, message, wParam, lParam));
}

/* If F1 without shift, then call up help main index topic */
else {
WinHelp(hWnd,szHelpFileName,HELP_INDEX,0L);
}
}

else if (wParam == VK_ESCAPE && bHelp) {

/* Escape during help mode: turn help mode off */
bHelp = FALSE;
#if defined(__WIN32__)
SetCursor((HCURSOR)GetClassLong(hWnd,GCL_HCURSOR));
#else
SetCursor((HCURSOR)GetClassWord(hWnd,GCW_HCURSOR));
#endif
}

break;

case WM_SETCURSOR:
/* In help mode it is necessary to reset the cursor in response */
/* to every WM_SETCURSOR message.Otherwise, by default, Windows */
/* will reset the cursor to that of the window class. */

if (bHelp) {
SetCursor(hHelpCursor);
break;
}
return (DefWindowProc(hWnd, message, wParam, lParam));

case WM_INITMENU:
if (bHelp) {
SetCursor(hHelpCursor);
}
return (TRUE);

case WM_ENTERIDLE:
if ((wParam == MSGF_MENU) && (GetKeyState(VK_F1) & 0x8000)) {
bHelp = TRUE;
PostMessage(hWnd, WM_KEYDOWN, VK_RETURN, 0L);
}
break;

case WM_DESTROY:
WinHelp(hWnd,szHelpFileName,HELP_QUIT,0L);
PostQuitMessage(0);
break;

default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}

return 0L;
}

/****************************************************************************

FUNCTION: About(HWND, UINT, WORD, LONG)

PURPOSE: Processes messages for "About" dialog box

MESSAGES:

WM_INITDIALOG - Initialize dialog box
WM_COMMAND- Input received

****************************************************************************/
#pragma argsused

BOOL FAR PASCAL _export About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
case WM_INITDIALOG:
return (TRUE);

case WM_COMMAND:
if (GET_WM_COMMAND_ID(wParam, lParam) == IDOK) {
EndDialog(hDlg, TRUE);
return (TRUE);
}
break;
}

return (FALSE);
}


/****************************************************************************

FUNCTION: MakeHelpPathName

PURPOSE: HelpEx assumes that the .HLP help file is in the same
directory as the HelpEx executable.This function derives
the full path name of the help file from the path of the
executable.

****************************************************************************/

void MakeHelpPathName(char* szFileName)
{
char * pcFileName;
int nFileNameLen;

nFileNameLen = GetModuleFileName(hInst,szFileName,EXE_NAME_MAX_SIZE);
pcFileName = szFileName + nFileNameLen;

while (pcFileName > szFileName) {
if (*pcFileName == '\\' and and *pcFileName == ':') {
*(++pcFileName) = '\0';
break;
}
nFileNameLen--;
pcFileName--;
}

if ((nFileNameLen+13) < EXE_NAME_MAX_SIZE) {
lstrcat(szFileName, "helpex.hlp");
}

else {
lstrcat(szFileName, "?");
}

return;
}
盘谷 2000-02-18
  • 打赏
  • 举报
回复
依靠帮助制作软件应该可以实现此项功能。
例如:help & Manual 2.0
可以试一试!
sadpacific 2000-02-18
  • 打赏
  • 举报
回复
To WHQ:
多谢。
你所说的“帮助ID”是指HelpContext属性吗?怎样处理WM_HELP消息呢?
有没有这方面的例子?
sadpacific 2000-02-18
  • 打赏
  • 举报
回复
To kxy:
我试过Form的OnHelp事件,即使Application的HelpFile已经赋值,
还是没有任何反应。
WHQ 2000-02-18
  • 打赏
  • 举报
回复
你得有一帮助文件,并为每一需要显示帮助信息的控件设定一个帮助ID(与帮助文件中的相关帮助主题一致),然后在对话框中处理WM_HELP消息
Lin 2000-02-18
  • 打赏
  • 举报
回复
我也没试过:
每个Form都有OnHelp事件,如果Application的HelpFile赋值了的话,是不是可以通过响应OnHelp事件来解决?
如果不行,戴妃5有一ApplicationEvent控件,也有OnHelp属性,再试试?
kxy 2000-02-18
  • 打赏
  • 举报
回复
?

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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