jQueryのプラグインであるreadmore.jsで、「続きを読む」を実装する。
注意点は、どうもjqueryのバージョンが1.*.*系列でないと動かないらしい。少なくとも3.3.1では動作しなかった。
<head> <script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.js'></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/Readmore.js/2.2.0/readmore.js"></script> <script> $(document).ready(function() { $('.art').readmore({ speed: 1000, collapsedHeight: 100, moreLink: '<a href="#">続きを見る</a>', lessLink: '<a href="#">閉じる</a>' }); }); </script> </head>
<div class="art"> <p>ここに隠したい文章を入れる。</p> <p>この機能は頭を少し見せるので、collapsedHeightの数字でどれだけ隠すかを指定する必要がある。</p> </div>
3Dカーソルを操作する方法のまとめ。
1. 任意の座標に移動
プロパティシェルフ→[3D Cursor]から座標入力
2. その他の移動先:
オブジェクト原点(origin)へ移動 |
Shift+S | Cursor to Selected | |
初期位置(0,0,0)へ移動 | Cursor to Center | ||
現在の座標に最も近い、小数点以下が0の座標へ移動 | Cursor to Grid | ||
現在選択中のオブジェクトの原点へ移動 | Cursor to Active |
1.UV展開する(テクスチャを使うため)
2.[Object] - [Object Tree] の「+」をクリックしてObject Node Treeを追加する
3.[V-Ray Object Node Tree] を表示する
4.[Geometry] - [Displacement]ノードを追加する
5.テクスチャのintensityをDisplacementのfloatへ接続する。
必要時応じて[Amount]を大きくする
6.レンダリング
7.色はマテリアル設定で[Displacement]と同じテクスチャを指定している
右クリックメニューと同じ要領で、ボタンを押した場所にメニューを出すことを考える。
#include <windows.h> #include <tchar.h> #include "resource.h" HMENU hmenu_dummy; const UINT ID_MENU_1 = 100; const UINT ID_MENU_2 = 101; INT_PTR CALLBACK DlgWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp){ INT_PTR ret = FALSE; switch (msg) { case WM_DESTROY: DestroyMenu(hmenu_dummy); break; case WM_INITDIALOG://メニューの初期設定/////////////////////////// hmenu_dummy = CreatePopupMenu(); //トップのダミーメニュー MENUITEMINFO mii; mii.cbSize = sizeof(MENUITEMINFO); mii.fMask = MIIM_ID | MIIM_TYPE; mii.fType = MFT_STRING; mii.wID = ID_MENU_1; mii.dwTypeData = _T("項目1"); InsertMenuItem(hmenu_dummy, ID_MENU_1, FALSE, &mii);//メニューに項目追加 mii.wID = ID_MENU_2; mii.dwTypeData = _T("項目2"); InsertMenuItem(hmenu_dummy, ID_MENU_2, FALSE, &mii);//メニューに項目追加 break; case WM_COMMAND: switch(wp){ case IDC_BUTTON_MENU://ボタンを押したとき////////////////////// { RECT brect;//ボタンの矩形を取得 GetWindowRect(GetDlgItem(hWnd, IDC_BUTTON_MENU),&brect); TrackPopupMenu(//メニューを表示 hmenu_dummy, TPM_LEFTALIGN, //↓に指定する座標はメニューの左上 brect.left,brect.top + (brect.bottom-brect.top), 0, hWnd,//親ウィンドウ nullptr ); break; } case ID_MENU_1://メニュー1が押された//////////////////////// MessageBox(hWnd,_T("メニュー1"),0,0); break; case ID_MENU_2://メニュー2が押された//////////////////////// MessageBox(hWnd,_T("メニュー2"),0,0); break; } break; // ダイアログを閉じる case WM_CLOSE: EndDialog( hWnd , (INT_PTR)WM_CLOSE ); ret =TRUE; break; } return ret; } /////////////////////////////////////////////// // エントリーポイント ////////////////////////// ////////////////////////////////////////////// int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow ) { INT_PTR d = DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),nullptr,(DLGPROC)DlgWndProc ); PostQuitMessage(0); return 0; }
C++CLIでのDictionaryの使い方 一般的なものまとめ
System::Collections::Generic::Dictionary<String^,int>^ dic = gcnew System::Collections::Generic::Dictionary<String^,int>();
dic->Add("零",0); dic->Add("一",1); dic->Add("二",2); dic->Add("三",3); dic->Add("四",4);
int ret; ret = dic["零"]; Console::Write( String::Format("零 : {0}\n",ret) ); //または dic->TryGetValue("一",ret); Console::Write( String::Format("一 : {0}\n",ret) );
if (dic->Remove("二") == true) { Console::WriteLine("成功"); } else { Console::WriteLine("失敗"); } if (dic->Remove("八") == true) { Console::WriteLine("成功"); } else { Console::WriteLine("失敗"); }
System::Collections::Generic::Dictionary<String^, int>^ dup = gcnew System::Collections::Generic::Dictionary<String^, int>(dic);
if (dic->ContainsKey("一")==true) { Console::WriteLine( dic["一"] ); } if (dic->ContainsValue(1) == true) { Console::WriteLine("1 は存在する"); }
for each( String^ key in dic->Keys ) { Console::Write( String::Format("{0}\n",key) ); }
for each( int value in dic->Values ) { Console::Write( String::Format("{0}\n",value) ); }
for each( System::Collections::Generic::KeyValuePair<String^,int> pair in dic) { Console::Write( String::Format("{0} {1}\n",pair.Key,pair.Value) ); }
以下の関数ChangeExtendは拡張子を変更する。
拡張子を変えたい事態と言うのは時折生じる。例えばfilename.txtという入力に対し、filname.backupというファイル名を出力したいとか、ファイル名がfilename.docでも、中身はプレーンテキストなので.txtのほうが都合がいいなどだ。
この関数はファイル名の拡張子部分のみを指定した文字列に置き換える。ただし拡張子がない場合は指定した拡張子を付け加える。
#include <cassert> #pragma warning( disable : 4996 ) //! @brief 入力したファイル名の拡張子を指定したものに変更する //! @param [in,out] fname 少なくともファイル名を含むファイルパス //! @param [in] ext 新しい拡張子。「.」を含んではならない //! @warning ディレクトリ区切りは'\'とする //! @return なし void ChangeExtend(TCHAR* fname,TCHAR *ext){ assert(fname != nullptr); assert(ext != nullptr); TCHAR* ldot=fname; //最後に出現したディレクトリ区切りを求める TCHAR* posdir = _tcsrchr(fname,_T('\\')); //最後に出現した.を求める ldot=_tcsrchr(fname,_T('.')); //C:\abc.def\\abc など、最後の.より\の方が後に来る場合、拡張子なしと判断する if( posdir > ldot){ ldot = nullptr; } if( ldot == nullptr){ _tcscat(fname,_T(".")); } else{ _tcscpy(ldot,_T(".\0")); } _tcscat(fname,ext); } //////////////////////////////////////////////////// // テスト int _tmain(int argc, _TCHAR* argv[]) { TCHAR fname[1024]; _tcscpy(fname,_T("C:\\hello\\dir\\filename.doc")); ChangeExtend(fname,_T("txt")); _tprintf(fname); puts(""); getchar(); return 0; }
入力 | 出力 |
C:\hello\folder\ile | C:\hello\folder\file.txt |
C:\hello\folder\file.doc | C:\hello\folder\file.txt |
C:\hello\folder\.doc | C:\hello\folder\.txt |
C:\hello\folder\ | C:\hello\folder\.txt |
C:\hello\fol.der\file.doc | C:\hello\fol.der\file.txt |
file.doc | file.txt |
メニュー関連の関数として、以下がある。
CreateMenu |
ウィンドウのタイトルバーの下に張り付く横長のメニューを作成するための関数。この関数で作成したメニューに対し、AppendMenuまたはInsertMenuItemで項目を追加する。 |
CreatePopupMenu |
ポップアップメニュー、つまり縦に開かれるメニューを作成する関数。 |
AppendMenu |
InsertMenuItemに取って代わられ、いまは互換性のために存在している。
|
InsertMenuItem | メニューに項目を追加するための関数 |
従って、メニュー作成の手順は、
HMENU hMenuTop = CreateMenu();
としてメニューを作成し、
InsertMenuItem(hMenuTop , ID_MENU_TOP_1, FALSE, &mii1);
InsertMenuItem(hMenuTop , ID_MENU_TOP_2, FALSE, &mii2);
のようにメニュー項目を追加することになる。
最後に
SetMenu(hWnd,hMenuTop);
として、ウィンドウにメニューを関連づける。
ここで、上記mii1はMENUITEMINFO型の構造体の変数であり、メニューのアイテム追加の時に、アイテムの性質を渡すための変数である。
MENUITEMINFOはわかりにくいので、まずここにまとめる。
下記MENUITEMINFOのメンバのうち、どれを使うかをfMaskで指定する。
MENUITEMINFO mii;
メンバ名 | 指定例 | fMaskの指定 | 説明 |
mii.cbSize | = sizeof(MENUITEMINFO); | - | MENUITEMINFOのサイズ |
mii.fMask | = MIIM_ID | MIIM_STRING; | - | 以下のパラメータのうち使用する物 |
mii.fType | = MFT_RADIOCHECK; | MIIM_FTYPE | アイテムのタイプ |
mii.fState | = MFS_ENABLED; | MIIM_STATE | アイテムの状態 |
mii.wID | = 100; //ユーザー定義 | MIIM_ID | アイテムID |
mii.hSubMenu | = hSubMenu;//ユーザー定義 | MIIM_SUBMENU | サブメニューのハンドル |
mii.hbmpChecked | = NULL; | MIIM_CHECKMARKS | チェック表示時のビットマップ |
mii.hbmpUnchecked | = NULL; | MIIM_CHECKMARKS | チェック非表示時のビットマップ |
mii.dwItemData | = 0;//ユーザー定義 | MIIM_DATA | 任意の32ビット値 |
mii.dwTypeData | = "ファイル(&F)"; | MIIM_STRING | アイテムの内容 |
mii.cch | = sizeof("ファイル(&F)" | - | アイテムの文字列の長さ |
mii.hbmpItem | = NULL; | MIIM_BITMAP | ビットマップハンドル |
例1 ポップアップメニューなし
//////////////////////////////////////////////// HMENU hmenu_top = CreateMenu(); // メニュー作成 const UINT ID_MENU_TOP_1 = 1; const UINT ID_MENU_TOP_2 = 2; //////////////////////////////////////////////// MENUITEMINFO mii; memset(&mii, 0, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); //////////////////////////////////////////////// mii.fMask = MIIM_ID | MIIM_STRING; mii.wID = ID_MENU_TOP_1; mii.dwTypeData = _T("メニュー1"); InsertMenuItem(hmenu_top, ID_MENU_TOP_1, FALSE, &mii); mii.wID = ID_MENU_TOP_2; mii.dwTypeData = _T("メニュー2"); InsertMenuItem(hmenu_top, ID_MENU_TOP_2, FALSE, &mii); SetMenu(hDlg, hmenu_top);//ウィンドウにメニューを関連づける
例1 ポップアップメニューあり
//////////////////////////////////////////////// HMENU hmenu_top = CreateMenu(); // メニュー作成 const UINT ID_MENU_TOP_1 = 1; const UINT ID_MENU_TOP_2 = 2; HMENU hmenu_Lv1_1 = CreatePopupMenu(); //◆サブメニューの作成 HMENU hmenu_Lv1_2 = CreatePopupMenu(); //◆サブメニューの作成 //////////////////////////////////////////////// MENUITEMINFO mii; memset(&mii, 0, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); //////////////////////////////////////////////// mii.fMask = MIIM_ID | MIIM_STRING | MIIM_SUBMENU ; mii.wID = ID_MENU_TOP_1; mii.hSubMenu = hmenu_Lv1_1; //◆サブメニューの追加 mii.dwTypeData = _T("メニュー1"); InsertMenuItem(hmenu_top, ID_MENU_TOP_1, FALSE, &mii); mii.wID = ID_MENU_TOP_2; mii.hSubMenu = hmenu_Lv1_2; //◆サブメニューの追加 mii.dwTypeData = _T("メニュー2"); InsertMenuItem(hmenu_top, ID_MENU_TOP_2, FALSE, &mii); SetMenu(hDlg, hmenu_top);//ウィンドウにメニューを関連づける //////////////////////////////////////////////// // ◆サブメニューの項目追加 const UINT ID_MENU_Lv1_1 = 3; const UINT ID_MENU_Lv1_2 = 4; const UINT ID_MENU_Lv1_3 = 5; mii.fMask = MIIM_ID | MIIM_STRING; mii.wID = ID_MENU_Lv1_1; mii.dwTypeData = _T("サブ11"); InsertMenuItem(hmenu_Lv1_1, ID_MENU_Lv1_1, FALSE, &mii); mii.wID = ID_MENU_Lv1_2; mii.dwTypeData = _T("サブ12"); InsertMenuItem(hmenu_Lv1_1, ID_MENU_Lv1_2, FALSE, &mii); mii.wID = ID_MENU_Lv1_3; mii.dwTypeData = _T("サブ13"); InsertMenuItem(hmenu_Lv1_1, ID_MENU_Lv1_3, FALSE, &mii); //////////////////////////////////////////////// const UINT ID_MENU_Lv2_1 = 6; const UINT ID_MENU_Lv2_2 = 7; mii.fMask = MIIM_ID | MIIM_STRING; mii.wID = ID_MENU_Lv2_1; mii.dwTypeData = _T("サブ21"); InsertMenuItem(hmenu_Lv1_2, ID_MENU_Lv2_1, FALSE, &mii); mii.wID = ID_MENU_Lv2_2; mii.dwTypeData = _T("サブ22"); InsertMenuItem(hmenu_Lv1_2, ID_MENU_Lv2_2, FALSE, &mii);
参考文献
http://gurigumi.s349.xrea.com/programming/visualcpp/sdk_menu3.html
Vray for Blenderのテクスチャの中にFresnelが入っている。
http://tofusan.cocolog-nifty.com/blog/2013/03/post-557d.html
フレネル(Fresnel)とは、異なる屈折率を持つ2つの物体の界面において、光が反射する様子のこと
以下、Diffuseのカラーに繋いだ結果。平面だとわかりにくい。
球体だととてもわかりやすい。