當前位置:首頁 » 操作系統 » foc源碼

foc源碼

發布時間: 2023-02-19 16:00:07

① my-ui中的地圖怎麼使用

大家下載MYUI倉庫後,切換到 Branch_csdn_study 分支,用 VS2019 打開 MYUI.sln 文件,按 F5 即可運行 myui 的 demo。

如果想使用 myui ,你可以把 myui 項目編譯成 lib 或 dll ,然後再自己的項目中引用 myui.h 頭文件即可。當然你也可以將 myui 集成到你的項目中,只需要將代碼拷貝一下即可,MYUI 以簡單方便為主,不會讓開發者進行復雜的操作的。

MYUI窗口創建流程:
在講解 demo 之前,我先告訴大家MYUI窗口創建的基本流程,以便大家更好地理解 demo 中的代碼:
第一步:在需要使用UI的線程中(一般就是主線程,也就是WinMain 函數)對MYUI進行初始化
第二步:創建一個繼承 CWindowUI 的類,並實現 OnNotify 和 OnEvent 兩個回調函數
第三步:在OnEvent 的 EnumEvent::WindowInit 事件通知裡面,利用 CBuilder 類和 xml 文件創建UI界面。然後再利用 CWindowUI::AttachFrameView 函數,把UI界面附加到窗口之上。
第四步:在 OnNotify 回調中實現你對控制項通知的處理,比如按鈕點擊事件的處理。
第五步:既然窗口類已經實現了,那麼你就可以在 WinMain 中創建一個窗口對象,並用 ShowModal 函數把窗口展示出來。

demo 講解:
哈哈,看上去挺簡單把,那麼接來下讓我們來看看 demo 的相關源碼

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR szCmdLine, int iCmdShow)
{
TCHAR strFloder[MAX_PATH];
GetCurrentDirectory(MAX_PATH, strFloder);
//_Mole.Init( 0, hInstance);

ARGBREF refColor = RGB(1, 2, 3);
ARGBREF refColor2 = ARGB(5, 1, 2, 3);

MYUI::CUIThread::Init(hInstance);

CSysFunction::SetThreadDpiAwarenessContext(CSysFunction::UIDPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE);
CFrameWindow * window = new CFrameWindow();
RECT rect;
rect.left = 0;
rect.top = 0;
rect.right = 800;
rect.bottom = 640;

window->CreateEx(hInstance,NULL, WS_EX_LAYERED * 0 , WS_VISIBLE | WS_OVERLAPPEDWINDOW,
//WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_SYSMENU,
TEXT("HelloWin"), TEXT("HelloWin"), &rect);

window->SetIcon(IDI_ICON1);
window->CenterWindow();
window->ShowModal();
delete window;

MYUI::CUIThread::Uninit();
//_Mole.Term();

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
先解釋一下 MYUI::CUIThread::Init() ,這個是用來初始化UI庫的。MYUI 只支持單線程使用,要知道單線程UI才是最規范的操作,那如果其他線程想彈出一個對話框怎麼辦?你可以SendMessage 或 PostMessage 到主線程的窗口進行彈出,特別說明一下 SendMessage 函數保證了多線程安全的。其實MYUI 也提供了 CUIThread::WorkerActive 和 CUIThread::WorkerExecute 兩個函數來支持線程操作。這兩個函數的作用很大,我們後面的文章會介紹,有興趣的同學可以自己看看實現源碼。
MYUI::CUIThread::Init() 函數要求在使用MYUI的線程上調用(一般主線程就是UI線程),當不再需要MYUI 後,要記得調用 MYUI::CUIThread::Uninit() 函數。

demo 中還調用了 CSysFunction::SetThreadDpiAwarenessContext 函數,CSysFunction 類是為了實現不同系統和編譯器中的函數兼容而封裝的。而 SetThreadDpiAwarenessContext 加上 demo 中的參數,意思是啟用當前線程對DPI的響應。
由於MYUI內部實現了DPI自適應機制,控制項和文本都會自動放大縮小。如果你還想在不同的 DPI 下,提供對應大小的高清倍圖。比如在200%DPI 下提供二倍圖,那麼你可以在 CWindowUI::OnEvent 回調中,監聽 DpiChange 事件。當匹配到 200%DPI 時,調用 SetSkin 函數,設置新的皮膚路徑(這個路徑下的文件,當然就是二倍圖了,注意文件名的統一)。

當UI庫初始化完成,也啟用了DPI響應,我們 new 了一個 CFrameWindow 對象,不用說,這個就是我們的窗口對象了。而 WinMain 函數中對 CFrameWindow 對象的調用過程在干嗎,相信不用我解釋,大家都知道它在干什麼了。那麼我們直接進入 CFrameWindow 內部代碼的講解。看看 CFrameWindow.h 頭文件的部分定義:

class CBuilderControl : public IBuilderCallback
{
public:
virtual CControlUI * CreateControl(LPCTSTR strClass);
};

class CFrameWindow : public CWindowUI , public IControlHooker
{
public:
CFrameWindow();
~CFrameWindow();

void OnNotify(MUINOTIFY¬ify);
LRESULT OnEvent(MUIEVENT &event);

public:
virtual bool OnBefore(CControlUI* pControl, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT &lResule);
virtual bool OnAfter(CControlUI* pControl, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam, LRESULT &lResule);

protected:
virtual LRESULT CALLBACK WndProc(UINT message, WPARAM wParam, LPARAM lParam);

LRESULT OnCreate2(WPARAM wParam, LPARAM lParam);
LRESULT OnCreate(WPARAM wParam, LPARAM lParam);
LRESULT OnReady(WPARAM wParam, LPARAM lParam);

LRESULT OnTimer(WPARAM wParam, LPARAM lParam);

private:
CMenuUI * m_pMenUI;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
先說一下 CFrameWindow ,前面已經說過,想實現MYUI窗口對象,只需要繼承 CWindowUI 這個類,並且實現 OnNotify 和 OnEvent 這兩個虛函數即可,是不是很簡單。
OnNotify 是控制項通知回調,當控制項產生點擊之類的事件,便會發出通知。而 OnEvent 是窗口事件通知。關於兩個回調會通知哪些事件,這里貼一下代碼

enum EnumNotify
{
//處理消息後,如果返回false,表明不需要調用OnNotify
NonMessage = 0,
ClickItem,//控制項單擊消息
DbClickItem,//控制項雙擊消息
SelectChange,//滾動條

CheckItem, //用法跟SelectItem一樣,主要是STATE_CHECK狀態會配合特殊標志,如:STATE_UNKNOW

//存在多項的控制項,選擇(左擊或右擊)了某一項,wParam是控制項的狀態,
//通過判斷wParam,來判斷選中還是取消選中
SelectItem,
ActiveItem,//存在多項的控制項,左雙擊了某一項
TextChange,//文本發生了改變,一般關聯編輯框
SetFocus,//控制項獲得焦點
KillFocus,//控制項失去焦點
TimerCall,//消息通知

ShowTip,//請求展示tip
};

enum EnumEvent
{
WindowInit = 0,//WM_NCCREATE
RequestRenderEngine,//WM_CREATE
WindowReady,//WM_CREATE
WindowDestroy,//WM_NCDESTROY
WindowShow,//WM_SHOWWINDOW
OnFinal,//最後一條消息,一般在裡面執行delete this

DpiChange,
SetFocued,//WM_SETFOCUS
KillFocued,//WM_KILLFOCUS
OnTimer ,//WM_TIMER
DragOver,//一般是拖動結束時,觸發的消息
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
初次使用某些控制項,大家可以不知道會觸發哪些事件,到時候跟蹤一下代碼,或者在 OnNotify 和 OnEvent 打個斷點,很容易就能夠測試出來。

再說 OnEvent 回調中的 EnumEvent::WindowInit 事件,其實對應的是 WM_CREATE 消息通知,這個事件中 demo 調用了 OnCreate 函數,讓我們看看這個函數在干嗎:

LRESULT CFrameWindow::OnCreate(WPARAM wParam, LPARAM lParam)
{
TCHAR strSkin[MAX_PATH] = {0};
#if 0
wsprintf(strSkin, _T("file='%s'"), _T("skin/"));
#else
wsprintf(strSkin, _T("file='%s'"), _T("../Debug/skin/"));
#endif
SetSkin(strSkin);
//SetSkin(_T("skin\\"));

CControlUI * pRootLayout = nullptr;

CBuilderControl * pCallback = new CBuilderControl();
CBuilder * pBuilder = new CBuilder(this, pCallback);
pRootLayout = pBuilder->Create(strSkin, _T("frame.xml"));
delete pBuilder;
delete pCallback;
this->AttachFrameView(pRootLayout);

m_pMenUI = new CMenuUI();
m_pMenUI->Create(m_hInstance, _T("MYMENU"), strSkin, _T("menu.xml"));

CControlUI * pControl = pRootLayout->FindControlByName(_T("btnMenu"));

if (pControl)
{
pControl->SetMenu(m_pMenUI);
}

CControlUI* pEdit = FindControl(_T("edtMessage"));
if (pEdit)
{
//pEdit->SetText(_T("床前\t明月光\n疑是\t\t地上霜\n舉頭\t\t\t望明月\r\n低頭\t\t\t\t思故鄉"));
pEdit->SetText(_T("床前\n明月光\r\n疑是\n\n地上霜\n舉頭\n望\n明月"));

//pEdit->SetText(_T("床前\t明月光\r\n疑是\t\t地上霜\n"));
}

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
總的來說,OnCreate 中,首先調用了 SetSkin 設置皮膚路徑,然後通過 CBuilder 類,利用 frame.xml 文件來創建了控制項。這里有兩點需要跟大家介紹一下。
一,CBuilder 默認只能夠創建MYUI已經提供的控制項,如果 xml 中包含了自定義控制項,那麼 CBuilder 會尋求 IBuilderCallback 介面的幫助(這里我們的 CBuilderControl 類繼承了 IBuilderCallback 介面),當 IBuilderCallback 介面不為空,則調用裡面 CreateControl 函數,讓 CreateControl 函數來幫我們實現自定義控制項的創建,很明顯,這個 CreateControl 的實現需要開發者提供。
二,一個窗口只能包含一個主控制項。所謂主控制項你可以理解為樹根,而子控制項為樹枝樹葉。窗口對控制項的管理,大部分都是通過這種樹結構,從樹根往樹葉方向執行的。如果你熟悉窗口原理,就會知道WIN32中窗口和控制項其實是同一種東西。但在MYUI中,窗口和控制項的概念是完全分離的,它們是兩個概念的東西。如果你想把主控制項附加到窗口之上,必須像 demo 一樣調用 AttachFrameView 函數。

此外 OnCreate 函數中還創建了一個特殊的控制項 —— 菜單。菜單特殊是因為它的本質是彈出一個窗口,所以它的創建動作跟 WinMain 中創建窗口的動作有點相似。至於菜單的大致使用方法,大家可以先參考 demo ,更詳細的我們在後面的文章再介紹。

OnCreate 函數介紹完了,有些同學可能會好奇 OnReady 函數和它對應的 EnumEvent::WindowReady 消息是幹嘛的。EnumEvent::WindowReady 其實是在 WM_CREATE 消息中通過 PostMessage 發出的。為什麼要這樣做呢?因為開發者在 WM_CREATE 創建控制項後,由於 WM_SIZE 消息還沒到達,這個時候控制項的一些屬性的值是還沒完全確定下來的。PostMessage - EnumEvent::WindowReady 消息就是為了在控制項屬性完全確定下來後,再發一條消息給用戶,讓用戶自己判斷是否需要修改某些東西。
上面的說法,貌似在告訴開發者,EnumEvent::WindowInit 消息是用來創建對象的,而 EnumEvent::WindowReady 消息時用來設置對象屬性的。嗯,這樣做確實比較規范,但如果不是特別的需要,其實你在 EnumEvent::WindowReady 不用處理任何東西。

當窗口和控制項都初始化完畢後,界面正式呈現在用戶眼前,如果對控制項進行操作,將會再 OnNotify 回調中產生對應的事件,開發者也可以在裡面寫入業務處理邏輯。

好了,關於demo 的代碼就介紹到這里了,其實它並不難,大家多看幾遍就會明白。然後我們再說說用來創建UI的 xml 文件。在 CFrameWindow::OnCreate 中,我們知道UI界面主要是通過 frame.xml 的描述來創建的。常規的 xml 文件格式如下:

<myui>
<全局聲明 1/> <!--窗口用到的一些屬性定義-->
<全局聲明 2/>
<全局聲明 3/>
<window> <!--所有窗口屬性 -->
<Control/> <!--所有子控制項 -->
</window>
</myui>
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
其中myui這個標簽是必須的,只有檢測到這個標簽,MYUI界面庫才會往下解析其他語句。至於其他屬性,大家可以對 demo 調試來知道它的作用,也可以查看 Attribute.xml 文檔說明。

資源打包:
好了,我們已經知道一個最基礎的MYUI窗口已經創建出來,但實際的項目中,資源往往需要打包到 exe 中,那我們再來介紹一下 MYUI 的資源打包方法。

② FOC為什麼要進行Park換算

現裡面的Clark變換和park變換和我們一般見到的形式一點也不一樣,按照st庫裡面的Clark和park變換函數注釋以及源代碼的分析可得出。還有st的矩陣的第二行為正數,書上的矩陣第二行為負數:st所使用的公式和書上使用的公式相差一個系數sqrt(3/2)

③ stm32 foc2.0不開源

stm32 foc2.0不開源可能是演算法裡面缺少了算式。
STM32 Foc開源演算法,包括觀測器和Foc method,STM32F0系列FOC源代碼,有單電阻采樣和三電阻采樣兩種代碼。
掃描隧道顯微鏡(Scanning Tunneling Microscope, 縮寫為STM)是一種掃描探針顯微術工具,掃描隧道顯微鏡可以讓科學家觀察和定位單個原子,它具有比它的同類原子力顯微鏡更加高的解析度。STM使人類第一次能夠實時地觀察單個原子在物質表面的排列狀態和與表面電子行為有關的物化性質,在表面科學、材料科學、生命科學等領域的研究中有著重大的意義和廣泛的應用前景,被國際科學界公認為20世紀97年代世界十大科技成就之一。隧道針尖的結構是掃描隧道顯微技術要解決的主要問題之一。針尖的大小、形狀和化學同一性不僅影響著掃描隧道顯微鏡圖像的解析度和圖像的形狀,而且也影響著測定的電子態。針尖的宏觀結構應使得針尖具有高的彎曲共振頻率,從而可以減少相位滯後,提高採集速度。如果針尖的尖端只有一個穩定的原子而不是有多重針尖,那麼隧道電流就會很穩定,而且能夠獲得原子級分辨的圖像。針尖的化學純度高,就不會涉及系列勢壘。例如,針尖表面若有氧化層,則其電阻可能會高於隧道間隙的阻值,從而導致針尖和樣品間產生隧道電流之前,二者就發生碰撞。制備針尖的材料主要有金屬鎢絲、鉑-銥合金絲等。鎢針尖的制備常用電化學腐蝕法。而鉑- 銥合金針尖則多用機械成型法,一般 直接用剪刀剪切 而成。不論哪一種針尖,其表面往往覆蓋著一層氧化層,或吸附一定的雜質,這經常是造成隧道電流不穩、噪音大和掃描隧道顯微鏡圖象的不可預期性的原因。因此,每次實驗前,都要對針尖進行處理,一般用化學法清洗,去除表面的氧化層及雜質,保證針尖具有良好的導電性。

熱點內容
weblogiclinux安裝 發布:2025-08-02 13:59:41 瀏覽:566
vivo手機為什麼不能設置鎖屏密碼 發布:2025-08-02 13:52:05 瀏覽:645
php二進制加密 發布:2025-08-02 13:51:04 瀏覽:280
水強行壓縮 發布:2025-08-02 13:37:23 瀏覽:988
nginx內網訪問 發布:2025-08-02 13:35:06 瀏覽:31
如何用解壓密碼解壓手機文件 發布:2025-08-02 13:32:56 瀏覽:217
lex製作編譯器 發布:2025-08-02 13:31:52 瀏覽:5
php把數組寫入文件 發布:2025-08-02 13:25:51 瀏覽:280
網頁升級訪問狼 發布:2025-08-02 13:20:37 瀏覽:753
雲頂之弈決斗壓縮陣容 發布:2025-08-02 13:08:59 瀏覽:555