Winform编程总结1—从网上找到一个winform控件,实现打开word的功能

using System;
  2  using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Drawing;
  5 using System.Data;
  6 using System.Text;
  7 using System.Windows.Forms;
  8 using System.Runtime.InteropServices;
  9 
 10 namespace WinWordControl
 11 {
 12     public partial class WinWordControl : UserControl
 13     {
 14         public WinWordControl()
 15         {
 16             InitializeComponent();
 17 
 18         }
 19 
 20         #region "API usage declarations"
 21 
 22         [DllImport("user32.dll")]
 23         public static extern int FindWindow(string strclassName, string strWindowName);
 24 
 25         [DllImport("user32.dll")]
 26         static extern int SetParent(int hWndChild, int hWndNewParent);
 27 
 28         [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
 29         static extern bool SetWindowPos(
 30             int hWnd,               // handle to window
 31             int hWndInsertAfter,    // placement-order handle
 32             int X,                  // horizontal position
 33             int Y,                  // vertical position
 34             int cx,                 // width
 35             int cy,                 // height
 36             uint uFlags             // window-positioning options
 37             );
 38 
 39         [DllImport("user32.dll", EntryPoint = "MoveWindow")]
 40         static extern bool MoveWindow(
 41             int Wnd,
 42             int X,
 43             int Y,
 44             int Width,
 45             int Height,
 46             bool Repaint
 47             );
 48 
 49         [DllImport("user32.dll", EntryPoint = "DrawMenuBar")]
 50         static extern Int32 DrawMenuBar(
 51             Int32 hWnd
 52             );
 53 
 54         [DllImport("user32.dll", EntryPoint = "GetMenuItemCount")]
 55         static extern Int32 GetMenuItemCount(
 56             Int32 hMenu
 57             );
 58 
 59         [DllImport("user32.dll", EntryPoint = "GetSystemMenu")]
 60         static extern Int32 GetSystemMenu(
 61             Int32 hWnd,
 62             bool Revert
 63             );
 64 
 65         [DllImport("user32.dll", EntryPoint = "RemoveMenu")]
 66         static extern Int32 RemoveMenu(
 67             Int32 hMenu,
 68             Int32 nPosition,
 69             Int32 wFlags
 70             );
 71 
 72 
 73         private const int MF_BYPOSITION = 0x400;
 74         private const int MF_REMOVE = 0x1000;
 75 
 76 
 77         const int SWP_DRAWFRAME = 0x20;
 78         const int SWP_NOMOVE = 0x2;
 79         const int SWP_NOSIZE = 0x1;
 80         const int SWP_NOZORDER = 0x4;
 81 
 82         #endregion
 83 
 84         public Word.Document document;
 85         public static Word.ApplicationClass wd = null;
 86         public static int wordWnd = 0;
 87         public static string filename = null;
 88         private static bool deactivateevents = false;
 89 
 90         /// <summary>
 91         /// needed designer variable
 92         /// </summary>
 93         //  private System.ComponentModel.Container components = null;
 94 
 95         /// <summary>
 96         /// Preactivation
 97         /// It's usefull, if you need more speed in the main Program
 98         /// so you can preload Word.
 99         /// </summary>
100         public void PreActivate()
101         {
102             if (wd == null) wd = new Word.ApplicationClass();
103         }
104 
105         /// <summary>
106         /// Close the current Document in the control --> you can 
107         /// load a new one with LoadDocument
108         /// </summary>
109         public void CloseControl()
110         {
111             /*
112             * this code is to reopen Word.
113             */
114 
115             try
116             {
117                 deactivateevents = true;
118                 object dummy = null;
119                 object dummy2 = (object)false;
120                 document.Close(ref dummy, ref dummy, ref dummy);
121                 // Change the line below.
122                 wd.Quit(ref dummy2, ref dummy, ref dummy);
123                 deactivateevents = false;
124             }
125             catch (Exception ex)
126             {
127                 String strErr = ex.Message;
128             }
129         }
130 
131 
132         /// <summary>
133         /// catches Word's close event 
134         /// starts a Thread that send a ESC to the word window ;)
135         /// </summary>
136         /// <param name="doc"></param>
137         /// <param name="test"></param>
138         private void OnClose(Word.Document doc, ref bool cancel)
139         {
140             if (!deactivateevents)
141             {
142                 cancel = true;
143             }
144         }
145 
146         /// <summary>
147         /// catches Word's open event
148         /// just close
149         /// </summary>
150         /// <param name="doc"></param>
151         private void OnOpenDoc(Word.Document doc)
152         {
153             OnNewDoc(doc);
154         }
155 
156         /// <summary>
157         /// catches Word's newdocument event
158         /// just close
159         /// </summary>
160         /// <param name="doc"></param>
161         private void OnNewDoc(Word.Document doc)
162         {
163             if (!deactivateevents)
164             {
165                 deactivateevents = true;
166                 object dummy = null;
167                 doc.Close(ref dummy, ref dummy, ref dummy);
168                 deactivateevents = false;
169             }
170         }
171 
172         /// <summary>
173         /// catches Word's quit event
174         /// normally it should not fire, but just to be shure
175         /// safely release the internal Word Instance 
176         /// </summary>
177         private void OnQuit()
178         {
179             //wd=null;
180         }
181 
182 
183         /// <summary>
184         /// Loads a document into the control
185         /// </summary>
186         /// <param name="t_filename">path to the file (every type word can handle)</param>
187         public void LoadDocument(string t_filename)
188         {
189             deactivateevents = true;
190             filename = t_filename;
191 
192             if (wd == null) wd = new Word.ApplicationClass();
193             try
194             {
195                 wd.CommandBars.AdaptiveMenus = false;
196                 wd.DocumentBeforeClose += new Word.ApplicationEvents2_DocumentBeforeCloseEventHandler(OnClose);
197                 wd.NewDocument += new Word.ApplicationEvents2_NewDocumentEventHandler(OnNewDoc);
198                 wd.DocumentOpen += new Word.ApplicationEvents2_DocumentOpenEventHandler(OnOpenDoc);
199                 wd.ApplicationEvents2_Event_Quit += new Word.ApplicationEvents2_QuitEventHandler(OnQuit);
200 
201             }
202             catch { }
203 
204             if (document != null)
205             {
206                 try
207                 {
208                     object dummy = null;
209                     wd.Documents.Close(ref dummy, ref dummy, ref dummy);
210                 }
211                 catch { }
212             }
213 
214             if (wordWnd == 0) wordWnd = FindWindow("Opusapp"null);
215             if (wordWnd != 0)
216             {
217                 SetParent(wordWnd, this.Handle.ToInt32());
218 
219                 object fileName = filename;
220                 object newTemplate = false;
221                 object docType = 0;
222                 object readOnly = true;
223                 object isVisible = true;
224                 object missing = System.Reflection.Missing.Value;
225 
226                 try
227                 {
228                     if (wd == null)
229                     {
230                         throw new WordInstanceException();
231                     }
232 
233                     if (wd.Documents == null)
234                     {
235                         throw new DocumentInstanceException();
236                     }
237 
238                     if (wd != null && wd.Documents != null)
239                     {
240                         document = wd.Documents.Add(ref fileName, ref newTemplate, ref docType, ref isVisible);
241                     }
242 
243                     if (document == null)
244                     {
245                         throw new ValidDocumentException();
246                     }
247                 }
248                 catch
249                 {
250                 }
251 
252                 try
253                 {
254                     wd.ActiveWindow.DisplayRightRuler = false;
255                     wd.ActiveWindow.DisplayScreenTips = false;
256                     wd.ActiveWindow.DisplayVerticalRuler = false;
257                     wd.ActiveWindow.DisplayRightRuler = false;
258                     wd.ActiveWindow.ActivePane.DisplayRulers = false;
259                     wd.ActiveWindow.ActivePane.View.Type = Word.WdViewType.wdWebView;
260                     //wd.ActiveWindow.ActivePane.View.Type = Word.WdViewType.wdPrintView;//wdWebView; // .wdNormalView;
261                 }
262                 catch
263                 {
264 
265                 }
266 
267 
268                 /// Code Added
269                 /// Disable the specific buttons of the command bar
270                 /// By default, we disable/hide the menu bar
271                 /// The New/Open buttons of the command bar are disabled
272                 /// Other things can be added as required (and supported ..:) )
273                 /// Lots of commented code in here, if somebody needs to disable specific menu or sub-menu items.
274                 /// 
275                 int counter = wd.ActiveWindow.Application.CommandBars.Count;
276                 for (int i = 1; i <= counter; i++)
277                 {
278                     try
279                     {
280 
281                         String nm = wd.ActiveWindow.Application.CommandBars[i].Name;
282                         if (nm == "Standard")
283                         {
284                             //nm=i.ToString()+" "+nm;
285                             //MessageBox.Show(nm);
286                             int count_control = wd.ActiveWindow.Application.CommandBars[i].Controls.Count;
287                             for (int j = 1; j <= 2; j++)
288                             {
289                                 //MessageBox.Show(wd.ActiveWindow.Application.CommandBars[i].Controls[j].ToString());
290                                 wd.ActiveWindow.Application.CommandBars[i].Controls[j].Enabled = false;
291 
292                             }
293                         }
294 
295                         if (nm == "Menu Bar")
296                         {
297                             //To disable the menubar, use the following (1) line
298                             wd.ActiveWindow.Application.CommandBars[i].Enabled = false;
299 
300                             /// If you want to have specific menu or sub-menu items, write the code here. 
301                             /// Samples commented below
302 
303                             //                            MessageBox.Show(nm);
304                             //int count_control=wd.ActiveWindow.Application.CommandBars[i].Controls.Count;
305                             //MessageBox.Show(count_control.ToString());                        
306 
307                             /*
308                             for(int j=1;j<=count_control;j++)
309                             {
310                                 /// The following can be used to disable specific menuitems in the menubar    
311                                 /// wd.ActiveWindow.Application.CommandBars[i].Controls[j].Enabled=false;
312 
313                                 //MessageBox.Show(wd.ActiveWindow.Application.CommandBars[i].Controls[j].ToString());
314                                 //MessageBox.Show(wd.ActiveWindow.Application.CommandBars[i].Controls[j].Caption);
315                                 //MessageBox.Show(wd.ActiveWindow.Application.CommandBars[i].Controls[j].accChildCount.ToString());
316 
317 
318                                 ///The following can be used to disable some or all the sub-menuitems in the menubar
319                                 
320                                  
321                                 Office.CommandBarPopup c;
322                                 c = (Office.CommandBarPopup)wd.ActiveWindow.Application.CommandBars[i].Controls[j];
323                                 
324                                 for(int k=1;k<=c.Controls.Count;k++)
325                                 {
326                                     //MessageBox.Show(k.ToString()+" "+c.Controls[k].Caption + " -- " + c.Controls[k].DescriptionText + " -- " );
327                                     try
328                                     {
329                                         c.Controls[k].Enabled=false;
330                                         c.Controls["Close Window"].Enabled=false;
331                                     }
332                                     catch
333                                     {
334                                 
335                                     }
336                                 }
337                                 
338                                 
339 
340                                     //wd.ActiveWindow.Application.CommandBars[i].Controls[j].Control     Controls[0].Enabled=false;
341                                 }
342                                 */
343 
344                         }
345 
346                         nm = "";
347                     }
348                     catch (Exception ex)
349                     {
350                         MessageBox.Show(ex.ToString());
351                     }
352                 }
353 
354 
355 
356                 // Show the word-document
357                 try
358                 {
359                     wd.Visible = true;
360                     // wd.Activate(); //抛出异常:捕捉到COMException 无法激活应用程序
361 
362                     SetWindowPos(wordWnd, this.Handle.ToInt32(), 00this.Bounds.Width, this.Bounds.Height, SWP_NOZORDER | SWP_NOMOVE | SWP_DRAWFRAME | SWP_NOSIZE);
363 
364                     //Call onresize--I dont want to write the same lines twice
365                     OnResize();
366                 }
367                 catch
368                 {
369                     MessageBox.Show("Error: do not load the document into the control until the parent window is shown!");
370                 }
371 
372                 /// We want to remove the system menu also. The title bar is not visible, but we want to avoid accidental minimize, maximize, etc ..by disabling the system menu(Alt+Space)
373                 try
374                 {
375                     int hMenu = GetSystemMenu(wordWnd, false);
376                     if (hMenu > 0)
377                     {
378                         int menuItemCount = GetMenuItemCount(hMenu);
379                         RemoveMenu(hMenu, menuItemCount - 1, MF_REMOVE | MF_BYPOSITION);
380                         RemoveMenu(hMenu, menuItemCount - 2, MF_REMOVE | MF_BYPOSITION);
381                         RemoveMenu(hMenu, menuItemCount - 3, MF_REMOVE | MF_BYPOSITION);
382                         RemoveMenu(hMenu, menuItemCount - 4, MF_REMOVE | MF_BYPOSITION);
383                         RemoveMenu(hMenu, menuItemCount - 5, MF_REMOVE | MF_BYPOSITION);
384                         RemoveMenu(hMenu, menuItemCount - 6, MF_REMOVE | MF_BYPOSITION);
385                         RemoveMenu(hMenu, menuItemCount - 7, MF_REMOVE | MF_BYPOSITION);
386                         RemoveMenu(hMenu, menuItemCount - 8, MF_REMOVE | MF_BYPOSITION);
387                         DrawMenuBar(wordWnd);
388                     }
389                 }
390                 catch { };
391 
392 
393 
394                 this.Parent.Focus();
395 
396             }
397             deactivateevents = false;
398         }
399 
400 
401         /// <summary>
402         /// restores Word.
403         /// If the program crashed somehow.
404         /// Sometimes Word saves it's temporary settings :(
405         /// </summary>
406         public void RestoreWord()
407         {
408             try
409             {
410                 int counter = wd.ActiveWindow.Application.CommandBars.Count;
411                 for (int i = 0; i < counter; i++)
412                 {
413                     try
414                     {
415                         wd.ActiveWindow.Application.CommandBars[i].Enabled = true;
416                     }
417                     catch
418                     {
419 
420                     }
421                 }
422             }
423             catch { };
424 
425         }
426 
427         /// <summary>
428         /// internal resize function
429         /// utilizes the size of the surrounding control
430         /// 
431         /// optimzed for Word2000 but it works pretty good with WordXP too.
432         /// </summary>
433         /// <param name="sender"></param>
434         /// <param name="e"></param>
435         private void OnResize()
436         {
437             //The original one that I used is shown below. Shows the complete window, but its buttons (min, max, restore) are disabled
438             //// MoveWindow(wordWnd,0,0,this.Bounds.Width,this.Bounds.Height,true);
439 
440 
441             ///Change below
442             ///The following one is better, if it works for you. We donot need the title bar any way. Based on a suggestion.
443             int borderWidth = SystemInformation.Border3DSize.Width;
444             int borderHeight = SystemInformation.Border3DSize.Height;
445             int captionHeight = SystemInformation.CaptionHeight;
446             int statusHeight = SystemInformation.ToolWindowCaptionHeight;
447             MoveWindow(
448                 wordWnd,
449                 -2 * borderWidth,
450                 -2 * borderHeight - captionHeight,
451                 this.Bounds.Width + 4 * borderWidth,
452                 this.Bounds.Height + captionHeight + 4 * borderHeight + statusHeight,
453                 true);
454 
455         }
456 
457         private void OnResize(object sender, System.EventArgs e)
458         {
459             OnResize();
460         }
461 
462 
463         /// Required. 
464         /// Without this, the command bar buttons that have been disabled 
465         /// will remain disabled permanently (does not occur at every machine or every time)
466         public void RestoreCommandBars()
467         {
468             try
469             {
470                 int counter = wd.ActiveWindow.Application.CommandBars.Count;
471                 for (int i = 1; i <= counter; i++)
472                 {
473                     try
474                     {
475 
476                         String nm = wd.ActiveWindow.Application.CommandBars[i].Name;
477                         if (nm == "Standard")
478                         {
479                             int count_control = wd.ActiveWindow.Application.CommandBars[i].Controls.Count;
480                             for (int j = 1; j <= 2; j++)
481                             {
482                                 wd.ActiveWindow.Application.CommandBars[i].Controls[j].Enabled = true;
483                             }
484                         }
485                         if (nm == "Menu Bar")
486                         {
487                             wd.ActiveWindow.Application.CommandBars[i].Enabled = true;
488                         }
489                         nm = "";
490                     }
491                     catch (Exception ex)
492                     {
493                         MessageBox.Show(ex.ToString());
494                     }
495                 }
496             }
497             catch { }
498 
499         }
500 
501     }
502     public class DocumentInstanceException : Exception
503     { }
504 
505     public class ValidDocumentException : Exception
506     { }
507 
508     public class WordInstanceException : Exception
509     { }
510 
511 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用 WPF 中的自定义控件实现类似 WinForm 中的 NumericUpDown 控件。下面是一个简单的实现: 首先,创建一个新的 UserControl,命名为 NumericUpDown。在 UserControl 中添加两个 Button 控件一个 TextBox 控件一个 Label 控件,如下所示: ```xml <UserControl x:Class="WpfApp1.NumericUpDown" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="30" d:DesignWidth="120"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <TextBox x:Name="TextBox" Grid.Column="0" /> <Grid Grid.Column="1"> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Button x:Name="UpButton" Grid.Row="0" Content="▲" Click="UpButton_Click" /> <Button x:Name="DownButton" Grid.Row="1" Content="▼" Click="DownButton_Click" /> </Grid> <Label x:Name="Label" Content="Label" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,-20,0,0" /> </Grid> </UserControl> ``` 然后,在 NumericUpDown.xaml.cs 文件中添加以下代码: ```csharp public partial class NumericUpDown : UserControl { public NumericUpDown() { InitializeComponent(); } public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(NumericUpDown), new FrameworkPropertyMetadata(0.0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, ValueChangedCallback)); public static readonly DependencyProperty MinimumProperty = DependencyProperty.Register("Minimum", typeof(double), typeof(NumericUpDown), new PropertyMetadata(double.MinValue)); public static readonly DependencyProperty MaximumProperty = DependencyProperty.Register("Maximum", typeof(double), typeof(NumericUpDown), new PropertyMetadata(double.MaxValue)); public double Value { get { return (double)GetValue(ValueProperty); } set { SetValue(ValueProperty, value); } } public double Minimum { get { return (double)GetValue(MinimumProperty); } set { SetValue(MinimumProperty, value); } } public double Maximum { get { return (double)GetValue(MaximumProperty); } set { SetValue(MaximumProperty, value); } } private static void ValueChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { var numericUpDown = d as NumericUpDown; if (numericUpDown != null) { numericUpDown.TextBox.Text = e.NewValue.ToString(); } } private void UpButton_Click(object sender, RoutedEventArgs e) { var newValue = Value + 1.0; if (newValue <= Maximum) { Value = newValue; } } private void DownButton_Click(object sender, RoutedEventArgs e) { var newValue = Value - 1.0; if (newValue >= Minimum) { Value = newValue; } } } ``` 这里我们创建了 Value、Minimum 和 Maximum 三个依赖属性,分别表示当前值、最小值和最大值。当 Value 属性改变时,我们将文本框中的值更新为新值。当 UpButton 或 DownButton 被单击时,我们检查新值是否在最小值和最大值之间。如果是,则更新 Value 属性。最后,可以在 MainWindow.xaml 中使用 NumericUpDown 控件: ```xml <StackPanel> <Label>Value:</Label> <local:NumericUpDown Value="0" Minimum="-10" Maximum="10" /> </StackPanel> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值