作者damody (天亮damody)
看板C_and_CPP
標題[分享] 突然有硬幹 TextBox 的靈感
時間Fri Jun 28 06:02:07 2013
應該要叫 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: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