« 2013年11月 | トップページ

2013年12月

2013年12月30日 (月)

MOV を 90度 回転して MP4に

非破壊な自炊をしていたら時間かかってしょうがないので、動画でとることに。中華パッドでとると画像悪すぎなので、iPadでとったMOVをPCに取り込んで、MP4にしてファイルサイズを小さくして中華パッドにいれようかと思ったらどうも動画が横向きになっている。

Video Rotator http://www.videorotator.com/ だと 15秒やると登録を促されたのでやめ。(登録だけで無料だったかも?)
Avidemux http://avidemux.sourceforge.net/ は変換までできたけど、サイズ大きいし、表示できない。多分やり方悪い。
で、これまでMP4へ変換するのに使っていた
をみてみると、回転できる。
MP4のサイズも小さく、Avidemuxではできない、複数一気に変換できたし、フォーマット選択も不要で適当にボタン押すとできるし、あとは動画で本が読めればいいんだけど。

| | コメント (0) | トラックバック (0)

2013年12月14日 (土)

WTL のダイアログの CEDIT にフォーカス

WTL のdialog の エディットボックスを SetFocus() しても IDOKでかつrcファイルでDEFPUSHBUTTONなOKボタンにフォーカスあたりCEditにフォーカスあたらず。

ShowCaret()
SetSel()
してもだめ。

BEGIN_MSG_MAP(LoginAuthenticationDlg)
    MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
    xxx
END_MSG_MAP()
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    m_edit.SetFocus(); // これ必要
    m_edit.SetWindowTextW(str); // デフォルトで表示する文字設定
    long nEnd = m_edit.GetWindowTextLengthW();
    m_editUser.SetSel(nEnd, nEnd); // カーソルを文字列の最後に
    xxx
    // return TRUE; // ダイアログのデフォルトにフォーカス。
    return FALSE; // 明示的にSetFocusしているコントロールがあるときはFALSEを指定可能
}

WM_INITDIALOG な OnInitDialog の返り値でTRUEはだめで、FALSEを返せばいけた。

thanks

http://tech.dir.groups.yahoo.com/neo/groups/wtl/conversations/topics/3609
http://motos33.cocolog-nifty.com/blog/2008/02/setsel_337d.html

| | コメント (0) | トラックバック (0)

WinHTTP

WinHttpOpen と WinHttpConnect と WinHttpOpenRequest を一回呼んでWinHttpSendRequest (and WinHttpWriteData) と WinHttpReceiveResponse を繰り返し呼び出すようにしたら、2回目のWinHttpSendRequest または WinHttpWriteData で ERROR_INVALID_PARAMETER (87) が返る。

SendやWriteするデータが増えると ERROR_INVALID_PARAMETER で、減ると WinHttpReceiveResponse で ERROR_WINHTTP_TIMEOUT (12002) が返る。

同じ文字数ならOK。

ということで、WinHttpOpenRequest も WinHttpSendRequest と同様に繰り返し呼ぶようにしたらいけた。

以下PHP向けのPOSTの擬似コード。ベーシック認証付き。

hSession = WinHttpOpen(
        L"WinHTTP", 
        WINHTTP_ACCESS_TYPE_NO_PROXY,
        WINHTTP_NO_PROXY_NAME,
        WINHTTP_NO_PROXY_BYPASS,
        0
        );
WinHttpConnect(
        hSession,
        server,
        INTERNET_DEFAULT_HTTP_PORT,
        0
        );

をひとつのクラスで実施するようにして

m_hRequest= WinHttpOpenRequest(
        m_hConnect,
        L"POST",
        path.c_str(),
        NULL,
        WINHTTP_NO_REFERER,
        WINHTTP_DEFAULT_ACCEPT_TYPES,
        0
        );
// Basic Authentication
WinHttpSetCredentials(
        m_hRequest,
        WINHTTP_AUTH_TARGET_SERVER,
        WINHTTP_AUTH_SCHEME_BASIC,
        username.c_str(),
        password.c_str(),
        NULL
        );
const WCHAR szHeader[] = L"Content-Type: application/x-www-form-urlencoded\r\n";
std::string postData = "query=hello";
WinHttpSendRequest(
        m_hRequest,
        szHeader,
        -1L,
        WINHTTP_NO_REQUEST_DATA,
        0,
        postData.length(),
        0
        );
WinHttpWriteData(
        m_hRequest,
        buf,
        postData.length(),
        NULL
        );
// 上のWinHttpWriteDataの処理はWinHttpSendRequestにまとめると以下の一つでOK
/* WinHttpSendRequest(
        m_hRequest,
        szHeader,
        -1L,
        const_cast<char*>(postData.c_str()),
        postData.length(),
        postData.length(),
        0
        );
*/
WinHttpReceiveResponse(m_hRequest, NULL);
WinHttpQueryHeaders(
        m_hRequest,
        WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,
        NULL,
        &dwStatusCode,
        &dwSize,
        NULL
        );
switch(dwStatusCode){
    case 200:
        return DONE;
    case 401:
        return RequestError_401;
    default:
        return RequestError_INTERNAL_ERROR;
}

をもう一つのクラスで呼ぶようにする。

| | コメント (0) | トラックバック (0)

« 2013年11月 | トップページ