看板 C_and_CPP 關於我們 聯絡資訊
應該要叫 TextBox 才對,啊嘶~ 第三版:http://damody.googlecode.com/files/TextEditor_v3.7z changelog 修正 s3748679 版友說的問題 加入 Ctrl-C Ctrl-V Ctrl-X Delete 多行單行的功能 第二版:http://damody.googlecode.com/files/TextEditor_v2.7z 縮圖:http://ppt.cc/X6TJ changelog: 修正 text width 算不準的問題 加入 mouse select 的功能 code: http://damody.googlecode.com/files/TextEditor.7z 縮圖: http://ppt.cc/cCEu 定一個抽象層 EditorConcept 定一個實作層 GdiEditor 定一下要用的資料結構 struct Size { Size(); Size(int _w, int _h); int w, h; }; 拿來存有大小的東西 struct Vec2 { Vec2(); Vec2(int _x, int _y); int x, y; }; 存位置 struct Rect { Rect(); Rect(int _x, int _y, int _w, int _h); union { struct { int x, y, w, h; }; struct { int left, right, top, bottom; }; }; }; 存矩形 struct Color { Color(); Color(unsigned char _r, unsigned char _g, unsigned char _b); unsigned char r, g, b; }; 存顏色 定義外框大小 白邊大小 Size m_Size; Rect m_MarginSize; 定義一下顏色 Color m_MarginColor; Color m_BackGroundColor; 定一下字的大小 要不要顯示行號 要不要顯示專注點 愛的閃耀間隔 Size m_FontSize; bool m_ShowLineNumber; bool m_ShowFocus; double m_BlinkTime; 定一下基本拿 size 的函數 Size GetSize(); void SetSize(int w, int h); Rect GetMarginSize(); void SetMarginSize(const Rect& rc); 定一下繪圖函數 Render(); 畫背景函數 RenderBackGround(); 用純虛擬函數 定義畫靠右/左字串 virtual void DrawLeftString(int x, int y, const std::wstring& s) = 0; virtual void DrawRightString(int x, int y, const std::wstring& s) = 0; 用純虛擬函數 定義需要平台支援的函數 virtual void DrawRect(const Rect& area, const Color& c) = 0; virtual void SetFontSize(const EditorConcept::Size& s) = 0; virtual Size GetFontSize() = 0; 再把一些業務邏輯加進來 virtual void SetFocusBlinkTime(double v); virtual double GetFocusBlinkTime(); virtual void UpdateBlink(); virtual bool SafePositon(int x, int y); virtual void TypeEnter(); virtual void TypeHome(); virtual void TypeEnd(); virtual void TypeDelete(); virtual void TypeBackSpace(); enum MOVE_DIRECTION { UP, DOWN, LEFT, RIGHT }; virtual void MoveFocus(MOVE_DIRECTION md); 實作一下 平台相依函數 virtual void DrawRect(const Rect& area, const Color& c); virtual void DrawRightString(int x, int y, const std::wstring& s); virtual void DrawLeftString(int x, int y, const std::wstring& s); virtual void SetFontSize(const EditorConcept::Size& s); virtual Size GetFontSize(); protected: virtual void InterRenderStart(); virtual void InterRenderEnd(); 後記: 我是一個虛擬函數一個平台相依函數成對實作的, 這樣可以快速驗證, 後來有用 double buffer 來解決 愛(字)一直閃爍的問題, 就不多說了,因為這是對平台不夠了解的問題, 中間把平台相依函數做完後, 就剩把大量的業務邏輯實作在 EditorConcept 虛擬層的工作, 還有把這些邏輯跟WndProc 接在一起了。 還有 Focus 的閃爍時間是參考 chrono 來實作的~ 要感謝的 google 與 blog 太多了,就謝天吧~ -- 標題 [閒聊] 寫程式的時候要吃甜食 del680202:我寫程式的時候 都想脫光衣服 lgzenith:雙腳放到桌上反而容易進入狀況 loveme00835:看吉澤明步... #1Hc6x55S (Soft_Job) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.118.175.34
EdisonX:怎沒人推呢~ 06/28 16:40
MOONRAKER:太困難了所以放棄推 XD 06/28 17:55
s3748679:..這麼快就改版了嗎 話說回來: http://ppt.cc/Sxel 06/28 22:15
s3748679:WM_SIZE發生時.. g_GdiEditor這東西還未初始化說@__@ 06/28 22:16
damody:感謝樓上找到 bug 我來研究看看~ 06/28 22:26
s3748679:喔喔.. 應該沒辦法重現這個bug.. 畢竟程式是打開就炸掉.. 06/28 23:26
loveme00835:我變成簽名檔了... =..= 06/29 01:45
firejox:簽名檔wwww 06/29 05:19
※ 編輯: damody 來自: 114.37.89.226 (06/29 09:33)
cuteclare:這挺麻煩的 原po好強Q_Q 06/29 21:02
EdisonX:@@ 愈來愈有架式了... 06/29 21:17
yoco315:soft_job 版 = =" 偶被萬年水桶了... 06/30 03:12
damody:我覺得樓上噓的很棒,不過我沒當壞人的本錢,所以沒噓= = 06/30 03:27
cuteclare:噓的好~悔過書規則根本廢X 話說是在codejob 06/30 18:19
tomnelson:這po好強,可惜我時間不夠搞這個... 06/30 22:09
tomnelson:@yoco315:拍拍~ 06/30 22:11
damody:這感覺比較需要靈感,沒靈感的話要摸很久~ 07/01 00:16
damody:實作(8h)其實還好,是花在 debug gdi 的部份比較花時間 07/01 00:17
damody:其實還有一堆 bug 沒修 = = ,我會覺得修 bug 很花時間 07/01 03:32
cuteclare:請問一下原po那個clipboard 有用到哪些lib? 07/01 05:55
s3748679:(應該是預設的Windows專案設置吧.. 沒看到有其他lib 07/01 10:08
damody:跟樓上說的一樣,沒用什麼 lib 啊 = =? 07/01 11:01
damody:話說有哪位大大去 codejob 做個壞人當下版主? 07/01 12:23
tomnelson:時間不夠呀!三年前就勸過該板主了,聽都不聽,唉~ 07/01 22:18
tomnelson:希望下一個板主會謹記教訓! 07/01 22:18