Time of Update: 2017-02-27
.Net內建的產生縮圖的方法是Bitmap.GetThumbnailImage這個方法產生的縮圖不夠清 晰,一般我們會使用Graphics高品質插值發產生清晰的縮圖,這時候大小會不盡人意,怎 麼辦?我們可以使用jpeg壓縮的方法壓縮一下圖片,這樣圖片的大小會縮小到壓縮前的十分 之一。下面是完成這項工作的代碼:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.
Time of Update: 2017-02-27
要實現一個螢幕小鍵盤,需要監聽所有鍵盤事件,無論表單是否被啟用。因此需要一個全域的鉤子,也就是系統範圍的鉤子。什麼是鉤子(Hook)鉤子(Hook)是windows提供的一種訊息處理機制平台,是指在程式正常運行中接受資訊之前預先啟動的函數,用來檢查和修改傳給該程式的資訊,(鉤子)實際上是一個處理訊息的程式段,通過系統調用,把它掛入系統。每當特定的訊息發出,在沒有到達目的視窗前,鉤子程式就先捕獲該訊息,亦即鉤子函數先得到控制權。這時鉤子函數即可以加工處理(改變)該訊息,也可以不作處理而繼續傳遞該訊
Time of Update: 2017-02-27
前面說過,每個線程都有自己的資源,但是代碼區是共用的,即每個線程都可以執行相同的函數。這可能帶來的問題就是幾個線程同時執行一個函數,導致資料的混亂,產生不可預料的結果,因此我們必須避免這種情況的發生。C#提供了一個關鍵字lock,它可以把一段代碼定義為互斥段(critical section),互斥段在一個時刻內只允許一個線程進入執行,而其他線程必須等待。在C#中,關鍵字lock定義如下:lock(expression)
Time of Update: 2017-02-27
概述PC-Lint是一個曆史悠久,功能異常強勁的靜態代碼偵查工具。它的使用曆史可以追溯到電腦編程的遠古時代(30多年以前)。經過這麼多年的發展,它不但能夠監測出許多文法邏輯上的隱患,而且也能夠有效地幫你提出許多程式在空間利用、運行效率上的改進點,在很多專業級的軟體公司,比如Microsoft,
Time of Update: 2017-02-27
為了在運行時處理異常,程式要記錄大量的資訊。無論執行到什麼地方,程式都必須能夠識別出如果在此處拋出異常的話,將要被釋放哪一個對象;程式必須知道每一個進入點,以便從try塊中退出;對於每一個try塊,他們都必須跟蹤與其相關的catch子句以及這些catch子句能夠捕獲的異常類型。這種資訊的記錄不是沒有代價的。確保程式滿足異常規格不需要運行時的比較(runtime
Time of Update: 2017-02-27
上一篇中我介紹了一種通過封閉Critical
Time of Update: 2017-02-27
前面已經說過程式就是方法的描述,而方法的描述無外乎就是動作加動作的賓語,而這裡的動作在C++中就是通過語句來表現的,而動作的賓語,也就是能夠被操作的資源,但非常可惜地C++語言本身只支援一種資源——記憶體。由於電腦實際可以操作不止記憶體這一種資源,導致C++語言實際並不能作為底層硬體程式的編寫語言(即使是C語言也不能),不過各編譯器廠商都提供了自己的嵌入式彙編語句功能(也可能沒提供或提供其它的附加文法以使得可以操作硬體),對於VC,通過使用__asm語句即可實現在C++代
Time of Update: 2017-02-27
在《C++箴言:確保公開繼承類比“is-a”》一文中論述了 C++ 將 public inheritance(公有繼承)視為一個 is-a 關係。當給定一個 hierarchy(繼承體系),其中有一個 class Student 從一個 class Person 公有繼承,當為一個函數調用的成功而有必要時,需要將 Students 隱式轉型為 Persons,它通過向編譯器展示來做到這一點。用 private inheritance(私人繼承)代替 public
Time of Update: 2017-02-27
下面我們來看虛繼承。首先看看這C020類,它從C010虛繼承:}struct C010{ C010() : c_(0x01) {} void foo() { c_ = 0x02; } char c_;};struct C020 : public virtual C010{ C020() : c_(0x02) {} char c_;};運行如下代碼,查看對象的記憶體布局:PRINT_SIZE_DETAIL(C020)結果為:The size of C020 is 6The detail of C0
Time of Update: 2017-02-27
C#反射的入門學習首先要明白C#反射提供了封裝程式集、模組和類型的對象等等。那麼這樣可以使用反射動態建立類型的執行個體,將類型綁定到現有對象,或從現有對象擷取類型並調用其方法或訪問其欄位和屬性。如果代碼中使用了屬性,可以利用反射對它們進行訪問。一個最簡單的C#反射執行個體,首先編寫類庫如下:using System;namespace ReflectionTest{public class WriteTest{//public method with parametorspublic void
Time of Update: 2017-02-27
指標與引用看上去完全不同(指標用操作符’*’和’->’,引用使用操作符’.’),但是它們似乎有相同的功能。指標與引用都是讓你間接引用其他對象。你如何決定在什麼時候使用指標,在什麼時候使用引用呢?首先,要認識到在任何情況下都不能用指向空值的引用。一個引用必須總是指向某些對象。因此如果你使用一個變數並讓它指向一個對象,但是該變數在某些時候也可能不指向任何對象,這時你應該把變數聲明為指標,因為這樣你可以賦空值給該變數。相反,
Time of Update: 2017-02-27
在嵌入式系統中使用C++的一個常見問題是記憶體配置,即對new 和 delete 操作符的失控。具有諷刺意味的是,問題的根源卻是C++對記憶體的管理非常的容易而且安全。具體地說,當一個對象被消除時,它的解構函式能夠安全的釋放所分配的記憶體。這當然是個好事情,但是這種使用的簡單性使得程式員們過度使用new 和
Time of Update: 2017-02-27
明察秋毫,很多情況下是非常需要的,例如,如果我們完善了一套系統,能夠將四川賑災的款項的籌集、採購、分發等步驟都能明察秋毫,相信整個世界會安靜很多。同樣,對於一個使用Visio進行二次開發的程式來說,背後你需要知道使用者增加了那些裝置,刪除了那些裝置,修改了那些裝置,這樣你才能對整個系統的資料進行有效控制,否則“賑災”款項就可能丟失了,呵呵。那我們應該如何做才能有效處理這些事件,達到對裝置的變更明察秋毫呢?我前面介紹了一篇文章《C#進行Visio開發的事件處理
Time of Update: 2017-02-27
關於C++中異常的爭論何其多也,但往往是一些不合事實的誤解。異常曾經是一個難以用好的語言特性,幸運的是,隨著C++社區經驗的積累,今天我們已經有足夠的知識輕鬆編寫異常安全的代碼了,而且編寫異常安全的代碼一般也不會對效能造成影響。使用異常還是返回錯誤碼?這是個爭論不休的話題。大家一定聽說過這樣的說法:只有在真正異常的時候,才使用異常。那什麼是“真正異常的時候”?在回答這個問題以前,讓我們先看一看程式設計中的不變式原理。對象就是屬性彙總加方法,如何判定一個對象的屬性彙總是不是
Time of Update: 2017-02-27
我們知道,Visio的Shape對象有有3個比較特別的屬性,分別是Data1、Data2、Data3,平常我們很少用到它,因為我們如果需要屬性的話,可能會通過ShapeSheet的Customed
Time of Update: 2017-02-27
背景C++記憶體配置與釋放均由使用者代碼自行控制,靈活的機制有如潘多拉之盒,即讓程式員有了更廣的發揮空間,也產生了代代相傳的記憶體流失問題。對於新手來說,最常犯的錯誤就是new出一個對象而忘記釋放,對於一般小應用程式來說,一點記憶體空間不算什麼。但是當記憶體流失問題出現在需要24小時啟動並執行平台類程式上的時候,將會使系統可用記憶體飛速減少,最後耗盡系統資源,導致系統崩潰。所以學會如何防止並檢查記憶體流失,是一個合格的c++程式員必須具備的能力。但是由於記憶體流失是程式運行並滿足一定條件時才會發
Time of Update: 2017-02-27
判斷Visio圖紙上是否圖紙有裝置(存在圖元), 有兩種方法,一種是通過Window對象的SelectAll方法,在判斷選擇的集合是否不為空白即可,如下:/**//// <summary> /// 判斷是否有對象選定 /// </summary> /// <param name="window"></param> ///
Time of Update: 2017-02-27
停電分析,顧名思義,是對圖紙進行停電的邏輯分析。在電氣化線路中,一條線路是從一個電源出來,串連著很多很多的裝置的,進行停電分析,有兩個重要的作用:一是看圖紙上的Shape元件是否串連正常,二是看哪些裝置有電無電。通過給有電的裝置一種顏色(如綠色),無電的裝置一種顏色(如紅色),那麼就可以很明顯地看到通電的不同變化。對一張Visio繪製的電氣線路圖,我們如何進行停電分析呢?下面我們看看相關的序列邏輯先。在上面的順序圖表中,主要實現了這樣的思路:停電分析是通過儲存裝置相關串連資訊到資料庫,以電源(如
Time of Update: 2017-02-27
在1994年,我主要關心的是如何使ISO
Time of Update: 2017-02-27
templates(模板)是節省時間和避免代碼重複的極好方法。不必再輸入20個相似的 classes,每一個包含 15 個 member functions(成員函數),你可以輸入一個 class template(類模板),並讓編譯器執行個體化出你需要的 20 個 specific classes(特定類)和 300 個函數。(class template(類模板)的 member