發表文章

圖片
 Python Combobox select item (not change current item) connect function 一般的網路文章範例都是有變更才觸發指定函式。 也就是 self.cboTest.currentIndexChanged.connect(self.cboTest3) 但是,如果你按下原設定而未改變值,那就並不會觸發cboTest3 function, 如果你的這個GUI介面希望按下原設定也可以呼叫函式,那就必須使用 self.cboTest.activated.connect(self.cboTest2) 之前,搜尋網路有人提過使用了另一個方法, self.cboTest.view().pressed.connect(self.cboTest1) 雖然會觸發執行cboTest1 function, 但是如果你變更comboBox項目,此觸發函式得到的s1=self.cboTest.currentText() 會是前次選定的項目,而不是你現階段選取的值。可能pressed時的current index還尚未變更吧! 下圖是我測試的程序: 如果參考上方的程式 跟執行的結果(我的combobox裡面先放1,2,3,4,5五個項目,第一次選2, 第二次選4, 第三次依舊選4 依照執行順序, function cboTest1, cboTest3, cboTest2, 明顯cboTest1執行時, currentText尚未變更。

Transfer 32bits hex textdata file of single precision to real by Matlab

如果你有一個文字檔是32位元形式的single precision floating data, 你要用Matlab把他讀出來畫圖。可以用如下方式取得:  fid1=fopen('SingleData.txt','r','b'); //SingleData.txt有1024行資料 A_cell=textscan(fid1,'%s'); //A_cell: 1x1 cell A_fetch_cell = A_cell{1}; //A_fetch_cell is 1024x1 cell  A=cell2mat(A_fetch_cell); //1024*8 char A_single_value=typecast(uint32(hex2dec(A)),'single'); //get 1024 single value fclose(fid1); A_single_value就可以拿來使用資料了!

Matlab single precision 與 hex碼互換

 Single precision轉換成hex code:  A = num2hex(single(10*log10(2))); 結果 A為'4040a8c1'   hex code(string) 轉換成single precision:  B = typecast(uint32(hex2dec('4040a8c1')),'single'); 結果B為 3.0103 (也就是10*log10(2))

[C#] Chart中多ChartAreas的Series與Legent設定

圖片
 Chart控制項是Visual Studio製作圖表頗強的工具。我想很多的網站都多少提到一些基本的,就不多重複了! 作為自己的筆記,就寫一些,實作時東找西找才找到完整東西來進行自己要的功能!如下圖,一個Chart,有三個ChartArea。在Series(數列)與Legent(圖標)對應到不同的ChartArea的筆記。 先講Series設定歸屬哪個ChartArea。由上而下,三個ChartArea分別命名為"waizi", "touxin", 以及"ziying"。我們有六個數列,分別命名為"外資買賣超", "外資持股", "投信買賣超", "投信持股", "自營商買賣超", "自營商持股"。數列歸屬程式段如下: chartResult.Series["外資買賣超"].ChartArea = "waizi"; chartResult.Series["外資持股"].ChartArea = "waizi"; chartResult.Series["投信買賣超"].ChartArea = "touxin"; chartResult.Series["投信持股"].ChartArea = "touxin"; chartResult.Series["自營商買賣超"].ChartArea = "ziying"; chartResult.Series["自營商持股"].ChartArea = "ziying"; 接下來是Legent的歸屬。我們命名三個Legent為"Legent1", "Legent2", "Legent3"。 var lg1 = chartResult.Legends.First(); lg1.Name = "Legend1"; var lg2 = char

C#利用DateTime估計程式執行時間

之前,常常用Timer來做這件事! 而Timer在C#有三種可以用! 搞得超複雜的! 後來看VB6有些是直接用Timer來相減。找了資訊也看到C#有類似的作法。參考 https://mike2014mike.github.io/c%23/2018/08/02/csharp-time-delta/ DateTime startT = DateTime.Now; //在程式執行前先定錨一個時間點 // 你的程式段開始 // ...... // 你的程式段結束 DateTime endT = DateTime.Now; //程式結束後再定一個時間點 TimeSpan dt = endT - startT; //用TimeSpan取得時間差 string str1 = dt.TotalMilliseconds.ToString(); //看你要取的時間差的時間單位 為了怕參考網址哪天內容不見了! 所以,自己記錄一下作法囉!

獲取C#給定對象的控制項Array的Index

圖片
這邊文基本上參考 https://www.coder.work/article/3058479 參考的文章寫的也挺清楚的! 我個人用到不少的控制項Array, 控制項操作共通性高, 所以事件處理常常合併處理! 那麼取得是哪個控制項觸發事件的就很重要!  如下圖:  選項勾選要記錄哪項動了!  參考了別人的作法,發現用lambda function或是Tag應該都可以。大約程式如下:  private void TestOption_Load(object sender, EventArgs e) { chkColorOption = new CheckBox[] { chkRed, chkGreen, chkBlue, chkGrey, chkWhite, chkBlack, chkFlash }; btnSaveSetting.Enabled = false; for (int i = 0; i < chkColorOption.Length; i++) { int index = i; //注意, 此項必須加! //不然對應的delegate參數index會變成7 this.chkColorOption[i].Checked = flagColorOption[i]; this.chkColorOption[i].Tag = i; //此方法取得index其實也可以 ---- //this.chkColorOption[i].CheckedChanged += new System.EventHandler(this.chkColorOption_CheckedChanged); //傳統delegate宣告方式 this.chkColorOption[i].CheckedChanged += (s, e2) => chkColorOption_CheckedChanged(index, s, e2); //採用la

C#取得控制項絕對位置

圖片
我偶爾會寫些設備類用的程式。一般會捨棄掉鍵盤的使用,如果使用了觸摸式的螢幕,甚至會不用滑鼠。那麼輸入數字或是某些字就會用虛擬的鍵盤。那麼這虛擬的鍵盤跳出來的位置我設定的就要在要輸入的TextBox的右下角。如果太邊緣,可能要在左上、左下、右上角落。不管怎樣,都必須知道我的TextBox的絕對位置。因為我的虛擬鍵盤等於是開新的Frame。如何取得呢? 如下程式: private void txtExp_Click(object sender, EventArgs e) { Point p = ((TextBox)sender).PointToClient(new Point(0, 0)); KeyPad kp = new KeyPad(false, true); kp.Left = -p.X + ((TextBox)sender).Width; kp.Top = -p.Y + ((TextBox)sender).Height; kp.ShowDialog(); if (!kp.cancel) ((TextBox)sender).Text = kp.numResult.ToString(); } 這裡面的Point p會得到相反的負值。結果,如下圖:

用C#建立電腦保護螢幕程式

自己嘗試著做一下電腦保護螢幕的程式。相信大家google找一下這個主題,應該也可以找到一些資料。 建好的exe檔請把exe附檔名改為scr檔。拷貝到目錄C:\Windows\System32下。 我們在設定保護螢幕時,有選取,設定,預覽等項目。試了一下,大約如下: 選取該項目:兩個參數。第一個: "/p", 第二個應該是handle之類的。程式中可以不處理。 設置按鈕:一個參數。字串為"/c:"+handle數字。設置完後,會再一次a.項中的選取該項目的參數,也就是該保護螢幕程式會執行兩次。 預覽按鈕:一個參數。字串為"/s"。 真實執行螢幕保護程式:與預覽按鈕相同。 在你的螢幕保護程式對應2.中的參數。實作在Program.cs內。大約如下: static void Main(string[] args) { if (args != null) { if (args.Length < 1) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new mainForm()); } else if (args[0].Substring(0, 2).Equals("/c")) { Application.Run(new SetItUp()); //設定卷軸速度表格 } else if (args[0].Substring(0, 2).Equals("/s")) { Application.Enab

Windows登錄檔C#程式編輯

Windows有提供Registry登錄檔以供系統或是程式使用。可以參考維基百科 登錄檔 。 使用類別: RegistryKey 命名空間: Microsoft.Win32 我們先看一下設定值的寫法 private void SetRegeditData(string name, string tovalue, RegistryValueKind regKind){ RegistryKey hklm = Registry.CurrentUser; RegistryKey software = hklm.OpenSubKey("Software", true); RegistryKey aimdir = software.CreateSubKey("DearJames"); aimdir.SetValue(name, tovalue, regKind); } 設定值本來存在的就覆蓋,本來沒有的就新建。 但是讀取值就不一樣了! 個人寫的function如下: private string GetRegeditData(string name) { string registData; RegistryKey hkml = Registry.CurrentUser; RegistryKey software = hkml.OpenSubKey("Software", true); RegistryKey aimdir = software.OpenSubKey("DearJames", true); if(aimdir==null) { software.CreateSubKey("DearJames"); aimdir = software.OpenSubKey("DearJames", true); } registData =

C# picturebox的Image 取得網路攝像頭圖像資料

版权声明:本文为CSDN博主「吕家少爷」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_43240642/java/article/details/101430811 PS. CSDN的作者也是我本人!  有個項目使用了攝影機,其為網路線傳輸資料的。內附的DLL是靠 Function: MVImageDrawHwnd(…) 〈-- 用Handle接受資料 Function: MVImageDraw(…) 〈-- 用hdc接受資料 原本使用了第一個Function, 把picturebox的Handle傳過去,MVImageDrawHwnd(hCameraImage, picturebox1.Handle,…) 結果Picturebox1裡面可以看到了影像。以單張的為例,Picturebox的卷軸一卷就不見了。檢查了picturebox1.Image內,發現是null。可是這圖像不是眼睛看到就好,我是要處理的。網站搜尋了一下,都沒有找到解決方法。拉里拉雜的話不談。直接把我解決的方式如下說了!我是使用了第二的Function實踐之!其實也該感謝搜尋的網站內容,很有啟發性! 在抓到摄影機的解析度时,先設定global Bitmap變數的大小: GrabImageData = new Bitmap(w, h); 在攝影機獲取圖像的函式內使用如下的程序: picGrab.Image = GrabImageData; //指定picGrab之Image為GrabImageData(Bitmap型態) Graphics g = Graphics.FromImage(picGrab.Image); //產生Graphics在picGrab上 IntPtr pptt2 = g.GetHdc(); //取得g之hdc MVAPI.MVImage.MVImageDraw(m_hImage, pptt2, 0, 0); //將取得相機之影像傳到建立在picGrab上之Bitmap,其連接在GrabImageData g.ReleaseHdc(); //Release HDC g.Dispose(); //釋放g 資源 在前項所列的g.Relea