① MFC树形控件不能显示图标
您好,这样:创建树的时候,为可选择的项设置一个值HTREEITEMTT=mTree.InsertItem("我的神呐",);mTree.SetItemData(HH,100);用的时候HTREEITEMhti=GetSelectedItem();intSel=mTree.GetItemData(hti);switch(Sel){case100:AfxMessageBox("我的神呐");break;}
② VB制作浏览器
我晕 这个你说得轻松 做起来可是大工程啊
Private Sub Form_Load() '窗体加载事件
'**********************************
If App.PrevInstance = True Then '判断是否已有实例在运行 是则退出
'MsgBox ("关机精灵已经运行了,请不要重复执行!"), vbOKOnly + vbExclamation + vbMsgBoxSetForeground, "提示!"
End
End If
'=======调用托盘图标方法
AddToTray Me
SetTrayTip "单击显示/隐藏窗体" & vbNullChar
End Sub
Private Sub Form_Resize()
If Me.WindowState = 1 Then
Me.Visible = Not Me.Visible
End If
End Sub
Private Sub Form_Unload(Cancel As Integer) '窗体卸载事件
RemoveFromTray
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) '***********************
Select Case CLng(X)
Case WM_RBUTTONUP '鼠标在图标上右击时弹出菜单
'Me.PopupMenu mnuTray
Case WM_LBUTTONUP '鼠标在图标上左击时窗口若最小化则恢复窗口位置
Me.Visible = Not Me.Visible
End Select
End Sub
给一个bas模块给你
Option Explicit
'本模块是加载系统托盘用
'函数调用如下
'Public Sub AddToTray(frm As Form)添加托盘SetTrayTip
'Public Sub RemoveFromTray()删除托盘
'Public Sub SetTrayTip(tip As String)提示信息修改
'Public Sub SetTrayIcon(pic As Picture)修改图标
Public OldWindowProc As Long
Public TheForm As Form
Public TheMenu As Menu
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
Public Const WM_USER = &H400
Public Const WM_LBUTTONUP = &H202
Public Const WM_MBUTTONUP = &H208
Public Const WM_RBUTTONUP = &H205
Public Const TRAY_CALLBACK = (WM_USER + 1001&)
Public Const GWL_WNDPROC = (-4)
Public Const GWL_USERDATA = (-21)
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4
Public Const NIM_ADD = &H0
Public Const NIF_MESSAGE = &H1
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2
Public Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
Uid As Long
UFlags As Long
UCallbackMessage As Long
HIcon As Long
SzTip As String * 64
End Type
Private TheData As NOTIFYICONDATA
Public Function NewWindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = TRAY_CALLBACK Then
If lParam = WM_LBUTTONUP Then
If TheForm.WindowState = 1 Then: TheForm.WindowState = 2: TheForm.Show: Exit Function
If TheForm.WindowState = 0 Or TheForm.WindowState = 2 Then TheForm.WindowState = 1
End If
End If
NewWindowProc = CallWindowProc(OldWindowProc, hwnd, Msg, wParam, lParam)
End Function
Public Sub AddToTray(frm As Form)
Set TheForm = frm
'Set TheMenu = mnu
OldWindowProc = SetWindowLong(frm.hwnd, GWL_WNDPROC, AddressOf NewWindowProc)
With TheData
.Uid = 0 '忘了吗?参考一下前面内容,Uid图标的序号,做动画图标有用
.hwnd = frm.hwnd
.HIcon = frm.Icon.Handle
.UFlags = NIF_ICON '指明要对图标进行设置
.UCallbackMessage = TRAY_CALLBACK
.UFlags = .UFlags Or NIF_MESSAGE '指明要设置图标或返回信息给主窗体,此句不能省去
.cbSize = Len(TheData) '为什么呢?我们需要在添加图标的同时,让其返回信息
End With '给主窗体,Or的意思是同时进行设置和返回消息
Shell_NotifyIcon NIM_ADD, TheData '根据前面定义NIM_ADD,设置为“添加模式”
End Sub
Public Sub RemoveFromTray()
With TheData
.UFlags = 0
End With
Shell_NotifyIcon NIM_DELETE, TheData '根据前面定义NIM_DELETE,设置为“删除模式”
SetWindowLong TheForm.hwnd, GWL_WNDPROC, OldWindowProc
End Sub
Public Sub SetTrayTip(tip As String)
With TheData
.SzTip = tip & vbNullChar
.UFlags = NIF_TIP '指明要对浮动提示进行设置
End With
Shell_NotifyIcon NIM_MODIFY, TheData '根据前面定义NIM_MODIFY,设置为“修改模式”
End Sub
Public Sub SetTrayIcon(pic As Picture)
If pic.Type <> vbPicTypeIcon Then Exit Sub
With TheData
.HIcon = pic.Handle
.UFlags = NIF_ICON
End With
Shell_NotifyIcon NIM_MODIFY, TheData
End Sub
③ C# 如何打开一个文件的属性窗口,还有如何打开WebBrowser控件加载的网页的属性。
WebBrowser的网页属性对框很简单。
webBrowser1.ShowPropertiesDialog();
就可以了。
文件的windows属性对话框比较麻烦,建议直接自己写窗体,读出各项属性。
如果要调用windows的,方法如下:
1、引用命名空间
using System.Runtime.InteropServices;
2、定义一个Struct,用于传递参数
[StructLayout(LayoutKind.Sequential)]
public struct SHELLEXECUTEINFO
{
public int cbSize;
public uint fMask;
public IntPtr hwnd;
[MarshalAs(UnmanagedType.LPStr)]
public string lpVerb;
[MarshalAs(UnmanagedType.LPStr)]
public string lpFile;
[MarshalAs(UnmanagedType.LPStr)]
public string lpParameters;
[MarshalAs(UnmanagedType.LPStr)]
public string lpDirectory;
public int nShow;
public IntPtr hInstApp;
public IntPtr lpIDList;
[MarshalAs(UnmanagedType.LPStr)]
public string lpClass;
public IntPtr hkeyClass;
public uint dwHotKey;
public IntPtr hIcon;
public IntPtr hProcess;
}
3、导入Windows API函数和一些常量
private const int SW_SHOW = 5;
private const uint SEE_MASK_INVOKEIDLIST = 12;
[DllImport("shell32.dll")]
static extern bool ShellExecuteEx(ref SHELLEXECUTEINFO lpExecInfo);
4、写调用查看文件属性的对话框
public static void ShowFileProperties(string Filename)
{
SHELLEXECUTEINFO info = new SHELLEXECUTEINFO();
info.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(info);
info.lpVerb = "properties";
info.lpFile = Filename;
info.nShow = SW_SHOW;
info.fMask = SEE_MASK_INVOKEIDLIST;
ShellExecuteEx(ref info);
}
这样就能通过ShowFileProperties("xxxx")来调用查看文件对话框了。
④ 如何对webbrowser和IE编程(六)求解答
无论你使用MFC, ATL, 或者标准 C++自动化IE,方法都是一样—你使用COM API来实现.VC++中创建一个Internet Explorer实例包括要调用COM API CoCreateInstance ,指定第一个参数为 CLSID_InternetExplorer 。创建IE自动化实例不像创建包含webbrowser的Activex控件困难。你不需要实现容器或者site对象的必要接口。来看看如何容易的使用CoCreateInstance 创建IE实例吧。启动Visual C++, 新建MFC AppWizard (exe) 应用程序命名为 MfcAutoIE.选择dialog-based option, 认可其他缺省选项.现在加入如VbAutoIE中的控件到表单.对话框看起来如 6-21. 分派ID到对话框的各个控件。 确信控件TAB次序如 Figure 6-22. (tab 次序影响到radio按钮的工作)
Figure 6-21.MfcAutoIE dialog.Figure 6-22.MfcAutoIE dialog tab order.现在用右键菜单设置每一个隐藏radio按钮的Group ,属性设置如表 6-9.Table 6-9.Member Variables for MfcAutoIE Dialog ControlsControlTypeMember VariableHide radio button for AddressBarintm_nAddressBarEdit boxCStringm_strStatusTextHide radio button for MenuBarintm_nMenuBarHide radio button for StatusBarintm_nStatusBarHide radio button for ToolBarintm_nToolBar我们使用ClassWizard 为表 6-9 中的控件建立变量时,他们自动加入到 CMfcAutoIEDlg. 成员变量设置为-1. 编译MfcAutoIE Example之前我们设置编译的Directory次序属性编译之前,你需要处理一些重要任务:1. 确信你已经从MSDN中下载IE5的头文件和库文件。2.在Tools/Options 菜单的Directories页, 确信lib路径中包含Internet Explorer 5 和 Windows 2000库文件.载列表中。3.配置Include:略 现在我们加入代码使之工作。 首先你应当包含ExDisp.h到你的对话框头文件—MfcAutoIEDlg.h. ExDisp.h 是包含了WebBrowser接口和类ID的头文件.确信你已经从MSDN下载了最新的版本。建立一个private 或者protected 的数据类型,指向IWebBrowser2 的指针, 命名为 m_pInetExplorer. 如下protected: IWebBrowser2* m_pInetExplorer;现在在构造函数中初始化m_pInetExplorer 为NULL 。你必须也初始化COM. 放置一个CoInitialize 的COM API调用在构造函数。构造函数看起来应当如下: CMfcAutoIEDlg::CMfcAutoIEDlg(CWnd* pParent /*=NULL*/) : CDialog(CMfcAutoIEDlg::IDD, pParent), m_pInetExplorer(NULL){ //{{AFX_DATA_INIT(CMfcAutoIEDlg) m_strStatusText = _T(""); m_nAddressBar = -1; m_nMenuBar = -1; m_nStatusBar = -1; m_nToolBar = -1; //}}AFX_DATA_INIT //Note that LoadIcon does not require a subsequent DestroyIcon //in Win32. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
// Initialize COM CoInitialize(NULL);}建立一个析构函数,以便调用CoUninitialize API 函数用以反初始化 COM. 此处的析构函数:CMfcAutoIEDlg::~CMfcAutoIEDlg(){ // Uninitialize COM. // CoUninitialize();}在预备工作之后, 让我们开始实现具体的控制。首先为Start IE5 按钮建立一个消息循环. 通常,你可以使用ClassWizard建立消息循环处理句柄. 在此消息句柄, 采用 CoCreateInstance API 建立一个IE实例。 此处初建的Internet Explorer实例初始化为隐藏, 所以你必须使用Visible属性使他可见。为了导航到用户的主页,使用GoHome 方法。此处为消息处理句柄代码:void CMfcAutoIEDlg::OnStartIE5() { // If an instance of Internet Explorer has // not already been created, create one. // This instance will initially be hidden, // so make it visible by using the Visible // property. Also, navigate to the user's // home page by using the GoHome method. // if (m_pInetExplorer) MessageBox (_T("Only one instance of Internet Explorer is allowed.")); else { HRESULT hr; hr = CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_SERVER, IID_IWebBrowser2, (LPVOID*)&m_pInetExplorer);
if (SUCCEEDED(hr)) { // Set the radio buttons to their correct values. SetRadioButtons();
m_pInetExplorer->put_Visible(VARIANT_TRUE); m_pInetExplorer->GoHome(); } }}在此代码中,我们首先检查是否IE的上一个实例已经建立。如果已经建立,将会显示一个错误消息框。(你仅仅能够启动一个IE的实例,随后你将可以看到如何检测IE窗口被关闭以便重置IE的数据成员。)如果一个IE的实例还未创建, CoCreateInstance 将CLSID_InternetExplorer 作为第一个参数被调用. (此类 ID 定义于ExDisp.h ,为Internet Explorer的唯一标示符.)第二个参数我们设定为NULL ,因为我们不希望此COM对象被聚合(be aggregated). 我们希望IE运行在一个单独的进程空间,所以我们指定第三个参数为特殊值 CLSCTX_SERVER .我们利用第四个参数指示哪一个接口我们将通过CoCreateInstance 调用创建一个COM对象后被创建。在此例中,我们将一直希望获得IWebBrowser2, 所以我们指定IID_IWebBrowser2 为第四个参数值。最后我们传送存储接口指针的变量. 对于此参数,你必须采用void类型传递一个指针的地址 (确信你传送的指针指向一个接口类型。)如果一个IE实例成功创建,名为SetRadioButtons 的成员变量被创建。这是一个protected 成员函数,检查当前地址栏、菜单条、工具条和状态条等的状态 ,用来设置radio 按钮组的状态。.为检查每一个的状态我们简单的获取属性关联的当前值 。C++ 应用中使用COM 没有包装类, 属性被引用为使用 get_ and put_ 方法.为检取每一个用户问题的状态,我们简单的调用每一个关联的(UI)项目的get_ 方法.除了 get_ToolBar外其他get_方法返回指向VARIANT_BOOL 数据类型,返回值指示用户接口是否可见或者隐藏。如果用户接口元素可见,将返回VARIANT_TRUE 。如果该项目是隐藏的,将返回VARIANT_FALSE 。这些值区别于TRUE 和FALSE 的用法.提醒当在Visual C++涉及VARIANT_BOOL , 你必须使用VARIANT_TRUE 或者VARIANT_FALSE 代替TRUE or FALSE. VARIANT_TRUE定义值0xffff, 而TRUE定义为1. 如果你比较VARIANT_TRUE 和TRUE, 你将发现在Vb中不匹配,你可以在涉及到VARIANT_BOOL. 使用true和false是由于VB替你实现了转换。get_ToolBar 方法不同于其他属性,因为它指向一个整型指针,所以我们如果发现返回非0,工具条可见。如果整型值是0,工具条将隐藏: 提醒如果一个属性只读, put_将不会出现。同样,如果一个属性只写,将不会出现get_方法。此处为 SetRadioButtons 方法的代码:void CMfcAutoIEDlg::SetRadioButtons(){ VARIANT_BOOL vtBool = VARIANT_TRUE;
// Get the current state of the AddressBar. // m_pInetExplorer->get_AddressBar(&vtBool); m_nAddressBar = (vtBool == VARIANT_TRUE) ? 1 : 0;
// Get the current state of the MenuBar. // m_pInetExplorer->get_MenuBar(&vtBool); m_nMenuBar = (vtBool == VARIANT_TRUE) ? 1 : 0;
// Get the current state of the StatusBar. // m_pInetExplorer->get_StatusBar(&vtBool); m_nStatusBar = (vtBool == VARIANT_TRUE) ? 1 : 0;
⑤ 如何进行网页元素的层次结构识别与信息抽取
如果用C++.net的话,System::Windows::Forms::WebBrowser这个类能容易地实现.