第一次使用Live Writer發布博客做個測試。^_^
1. MetaWeblog API地址:
cnblogs格式為:http://www.cnblogs.com/你的博客名/services/metaweblog.aspx
cppblog格式為:http://www.shnenglu.com/你的博客名/services/metaweblog.aspx
(在Options » Configure 頁面中可以查到)。
2. 下載Windows Live Writer,配置步驟:
2.1 在菜單中選擇“工具”》“帳戶”,出現下面的畫面:
2.2 點擊“添加按鈕”,在出現的窗口中選擇“其他日志服務”,如下圖 :
2.3 點擊“下一步”,出現添加日志帳戶的窗口,填入相應的內容,日志網址為您的博客主頁地址,用戶名填寫您的登錄用戶名(不是Blog名,也不是顯示名稱)和密碼,如下圖:
2.4 點擊“下一步”,出現配置檢測窗口
注:如果自動配置沒有成功,需要手動配置:
a) 在“Type of weblog that you are using”中選擇“Custom(Metaweblog API)”。
b) “Remote posting URL for your weblog”中輸入“http://www.cnblogs.com/你的博客名/services/metaweblog.aspx”。
2.5 檢測過程中會出現“是否要發布臨時日志”窗口(如下圖),一般選擇“No”。
2.6 檢測完畢之后,會出現下面的窗口,點擊“完成”就配置成功了。
3. 插件
3.1 SyntaxHighlighter
博客園內置支持SyntaxHighlighter代碼著色,代碼著色語法:<pre class='brush:編程語言'>代碼</pre>。
需要注意的是:如何你使用SyntaxHighlighter代碼著色,需要將默認編輯器改為TinyMCE。如果使用CuteEditor,CuteEditor會自動去除代碼中的空格,造成代碼格式破壞。
cnBlogs推薦的代碼著色插件是:Windows Live Writer Source Code plugin for SyntaxHighlighter
官方網址:http://sourcecodeplugin.codeplex.com/
本地下載:SourceCodePlugin_version_1.1.zip
將WindowsLiveWriter.SourceCode.dll復制到Windows Live Writer plugin文件夾:
* 32-bit systems: C:\Program Files\Windows Live\Writer\Plugins
* 64-bit systems: C:\Program Files (x86)\Windows Live\Writer\Plugins
使用方法:
安裝成功之后,在Live Writer會出現“Source Code”插件,如下圖:
點擊該插件,粘貼需要著色的代碼并選擇相應的編程語言即可。
可能是我插件沒安裝好,插入的代碼并沒高亮,直接在CppBlog后臺編輯下先回頭研究


/**//********************************************************************
** Copyright(c): 1987-2011 LynnRaymond
** All right reserved.
**
** Version: 1.0
** Author: LynnRaymond
** Date: 2011-8-23
**
** Module Name: An simple example for Windows Application
** File Name: helloblog.cpp
** Related Files:
**
** Description: An simple example for Windows Application
**
**-------------------------------------------------------
** Modifier:
** Version:
** Description:
*********************************************************************/

// header files
#include <windows.h>

// WindowProc Callback function
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);


// WinMain
// The entry of windows application
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)


{
static TCHAR szAppName[] = TEXT ("");
HWND hwnd;
MSG msg;

WNDCLASSEX wndclassex =
{0};
wndclassex.cbSize = sizeof(WNDCLASSEX);
wndclassex.style = CS_HREDRAW | CS_VREDRAW;
wndclassex.lpfnWndProc = WndProc;
wndclassex.cbClsExtra = 0;
wndclassex.cbWndExtra = 0;
wndclassex.hInstance = hInstance;
wndclassex.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclassex.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclassex.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wndclassex.lpszMenuName = NULL;
wndclassex.lpszClassName = szAppName;
wndclassex.hIconSm = wndclassex.hIcon;
if (!RegisterClassEx (&wndclassex))

{
MessageBox (NULL, TEXT ("RegisterClassEx failed!"), szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW,
szAppName,
TEXT ("WindowTitle"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow (hwnd, iCmdShow);
UpdateWindow (hwnd);
while (GetMessage (&msg, NULL, 0, 0))

{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}

// WindowProc Callback function
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)


{
HDC hdc;
PAINTSTRUCT ps;
switch (message)

{
case WM_CREATE:
return (0);
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
TextOut (hdc, 0, 0, L"A Window!", 27);
EndPaint (hwnd, &ps);
return (0);
case WM_DESTROY:
PostQuitMessage (0);
return (0);
}
return DefWindowProc (hwnd, message, wParam, lParam);
}

3.2 Paste from Visual Studio插件,下載
該插件代碼使用<pre>標簽,沒有空格、換行HTML標簽(節省一些HTML代碼),提供class="code"自定義<pre>標簽樣式。
高亮顯示代碼,只要從Visual Studio或者SQL Server中復制一下,然后點擊“插入from Visual Studio...”。其HTML代碼就自動生成了~,唯一的缺點就是每次會在結尾加一個空鏈接,可能來注明版權吧。
使用Windows Live Writer寫博文,建議把博客園編輯器設置為“純文本框”(后臺選項---Preferences---默認編輯器或者后臺左邊操作快捷通道),千萬不要使用CuteEditor,這個編輯器存在一些BUG,由于這個插件不是使用“ ”來縮進的,直接是空白用于縮進,編輯器存在BUG會過濾掉每行前面的空白,這樣導致你的代碼沒有縮進,在一行輸出。
Paste插件看起來正常,除了中間一些tab沒能對齊:
/********************************************************************
** Copyright(c): 1987-2011 LynnRaymond
** All right reserved.
**
** Version: 1.0
** Author: LynnRaymond
** Date: 2011-8-23
**
** Module Name: An simple example for Windows Application
** File Name: helloblog.cpp
** Related Files:
**
** Description: An simple example for Windows Application
**
**-------------------------------------------------------
** Modifier:
** Version:
** Description:
*********************************************************************/
// header files
#include <windows.h>
// WindowProc Callback function
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
// WinMain
// The entry of windows application
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("");
HWND hwnd;
MSG msg;
WNDCLASSEX wndclassex = {0};
wndclassex.cbSize = sizeof(WNDCLASSEX);
wndclassex.style = CS_HREDRAW | CS_VREDRAW;
wndclassex.lpfnWndProc = WndProc;
wndclassex.cbClsExtra = 0;
wndclassex.cbWndExtra = 0;
wndclassex.hInstance = hInstance;
wndclassex.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclassex.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclassex.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
wndclassex.lpszMenuName = NULL;
wndclassex.lpszClassName = szAppName;
wndclassex.hIconSm = wndclassex.hIcon;
if (!RegisterClassEx (&wndclassex))
{
MessageBox (NULL, TEXT ("RegisterClassEx failed!"), szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW,
szAppName,
TEXT ("WindowTitle"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow (hwnd, iCmdShow);
UpdateWindow (hwnd);
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}
// WindowProc Callback function
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch (message)
{
case WM_CREATE:
return (0);
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
TextOut (hdc, 0, 0, L"A Window!", 27);
EndPaint (hwnd, &ps);
return (0);
case WM_DESTROY:
PostQuitMessage (0);
return (0);
}
return DefWindowProc (hwnd, message, wParam, lParam);
}