「ToDo」を含む日記 RSS

はてなキーワード: ToDoとは

2019-07-14

片足上げて30カウントするとめんどくささが消えるっていう記事おもしろかった。

それの俺バージョンがある。

指を折り曲げる運動

主に、一切の気力がなく横になった状態から動けないでいるとき、とりあえず起きて動けるところまで持っていくために使う。

手順。

親指から小指まで順番に曲げる。

手がグーの形になったら今度は小指から親指の順で開いていく。そんだけ。

脳内の「しなければならないこと」リストを一度全部きれいに忘れて、それだけできれば後はなんもしなくてもOKリストを書き換える。

とにかく指の動きにだけ集中する。動きがシームレスになるまで続ける。

最初は片手だけ。勢いがついたら両手。

両手の指を動かすことからめんどくささが消えたら、次に手首を動かす。ぐるぐる適当に回す。スナップを効かせる。

手首の運動にも慣れたら今度は腕。適当にぐるぐる動かす。肩甲骨を巻き込んでいく。

腕の次は肩。ここまで動かせるようになったら、体を動かすアクションへのハードルがまあまあ下がっているので、勢いにまかせて上体を起こす。

上体を起こせたら、起こした体全体を揺さぶるようなイメージで動かしていく。気分はパリピ

後は二本足で立つだけ!

以上。

立った後のことは考えない。きれいに消し去ったTodoリストをCtrl+ZしたのちShift+Deleteで根絶やしにしてもいい。しなくてもいい。生きてるだけでえらい!

いか強迫義務感にとらわれず過ごすかを意識しているが、それを意識しすぎる義務感にかられている気がしてきてやばい

まり考えないのが重要だ…。

最近は、横たわって動きたくない状態とき以外にも、なんか最初アクションがめんどくせーと思ったとき、予備動作的ノリで指の運動をやっている。

後、すでに動ける状態の時は、料理番組ごっこの方が効く。

料理番組ごっこの手順。

作業行程を料理見立てて、まず○○を用意します…などと虚空に向かって喋る。

全行程を、自分という視聴者に向けて実際の動きを見せながら説明していくイメージ

後はひたすら独り言を言いながら作業する。

おわり。

2019-07-02

ズボラだけど家計簿始めた

すごくズボラな俺だけど借金や自営化してとうとう頭だけで把握が無理になった

Googleスプレッドシートを使ってる

 

返済がもしなければ別に「なるようになった」でも良いかもしれないけど

さすがに適当にやると詰みそうだったので

(よく今まで詰まなかったな)

 

入金ルート普通な給料)がまず5ルートある、入金タイミングも違う

あと手持ちという列を作った(ここの管理がわかりづらい)

出金は、家賃光熱費クレカ借金生活費、くらいの粒度なのに14ルートある

普通もっと電気代」とか「食費」とかにするんだろうけど、ムリムリのカタツムリ

何でこんなに多いのかは、借り入れが複数なのと、税金などのせいだ(所得税住民税保険年金などが個別徴収されるせい)

 

メモの列を3つ用意した、メモだらけだ

不確定要素があったり、一旦金をどこから調達するかとかでぐちゃぐちゃ

予想と予定とシミュレーションと実績とTODOが混ざるからカオス

上手い人はもっと上手く書くんだろうか

 

書いてみた所感(3ヶ月)

・支払い忘れが無くなるのは良いと思った

・これ、家計簿アプリとかだとムリだわこの情報量、だから嫌いなんだよ既成品は

 

無茶すれば3月くらいには全部返せる

頑張ろう

 

ところでこれは家計簿なのか??

事業的な何かではないか

そこらへん分けないとなー(そんな余裕はない)

2019-06-21

Gmailメメントみたいなことをする

Gmail受信箱TODOリストとかリマインダーみたいに使っていて、作業完了したメールアーカイブするようにしてるんだけど

たまに、リストの底の方にたまり続けるメールがあって、いつまでも解決できそうにないな…

というときは、映画メメント主人公みたいに「この記憶はなかったことにする」とかいって、アーカイブして意図的に忘れてしま

2019-06-02

クソアホうんこわたしを罵ってくれ……

五日ほど前:足スッキリシートっていうのめっちゃ気持ちいい……貰い物だけどこれ最高だ。なんでこんな優れた人類の宝を私は今までスルーしてきたのか。切れちゃったし買ってこよう。

四日ほど前:会社たかかにスッキリシートがいかにすばらしいか気持ちいか同僚に話し、大いに盛り上がって自分の正しさと叡智を再確認。良い気分で帰宅。→ほぎゃあああ!?買ってないよおおお!!

三日ほど前:忘れないようにランチタイムに昼を食べたついでに会社近くのドラッグストアで購入しようと心に決めるが、当てにしていた昼食屋さんが閉まっていて、見知らぬ居酒屋ランチ海鮮丼を食べている間に脳内は午後の回覧書類専有されて購入忘却。ほみゃああ!?→帰り道に買えば何の問題もないさと自らをクールダウンするも冷静沈着になりすぎ、感情を失ったわたしは当然のように帰途も足スッキリシート購入を忘れてしまう。ほぎゃああ!?子供か。子供なのかわたしは。小学生以下の自分の知能と注意力にふかくふかく絶望する。

二日前:もうわたしわたしを信じない。信じないつまり不信こそがライフハックソリューションスマホToDoに行動予定を仕込み帰宅時間に合わせて自分に指示を与える遠隔操作。→会社最寄り駅で指示を受取り電車に乗って自宅最寄り駅に到着した時点で全て忘却。→ほぎゃあああわたしがうらぎったああああ。なんで足スッキリシート程度が買えないのおおおおお。

昨日土曜日:一日寝てて夜に起き出しコンビニで飯を買ってもそもそ食う芋虫のようなライフ。→眠りにつく直前。ほぎゃああ!?コンビニ行ったのになんで買ってこないんだよわたし!!

今日日曜日会社の帰りとか言ってるからダメなんだ。そういう気持ちが足スッキリシートを遠ざけている。むしろ積極的に足スッキリシートを買いに行ってついでに昼ごはんを食べてこよう。→カレーうまかった満腹満腹!ついでに新刊書籍も買えて良いお出かけだった。やっぱダンゴムシのようなわたしでも週末引きこもりは良くないね~たまには出かけなきゃねー。ただいまー→ほぎゃややああああ足スッキリシート買うの忘れてるうううう!!!???かばかばかばか、しねわたしーーーーー!!!

2019-05-30

簡単初心者向けの資産形成 (長期投資)

初心者がどのように投資して無難資産形成すれば良いか、元記事コメントへの補足としてまとめました。中級者以上の方は読む必要が無い記事です。

はてブコメントへの補足として書いたので、全然初心者きじゃなかった。ということで、これを書いてる anond:20190601000848

基本は「eMAXIS Slim 全世界株式オールカントリー)をつみたてNISA確定拠出年金で買う」

anond:20190530161149

eMAXIS Slim 全世界株式オールカントリー)が参照する指標MSCI All Country World Index過去30年で年平均リターン7.3%なので4%は保守的見積もり一時的な下落は当然あって、標準偏差は15%程度。宝くじとの比較は論外。

と書いたけど、補足。

※元の記事書いた人とは別人です。わかりにくい書き方ですまない。

記事俺様がその場の気分で書き殴ったものであり、明示、黙示に関わらず内容の正確性あるいは完全性については保証するものではありません。また、本記事有価証券取引その他の取引勧誘目的としたものではありません。実際の取引等をご検討の際には、貴様の最終判断をもって行っていただきますようお願い致します。

楽天系以外の金融機関

SBIグループ (住信SBIネット銀行SBI証券) がおすすめ。ただし、UIは最悪。

個人的には楽天銀行が信用できない (連絡が無い、お願いした書類を送ってこないなど) のでSBIにしてる。

ちなみに、かつてはソフトバンクグループの一員だったが、現在資本関係無し。禿嫌いな人も安心して使い給え。

つみたてNISA以外

確定拠出年金: 個人確定拠出年金サラリーマン場合は月2.3万円が上限なのと、原則として60歳まで引き出せない、取扱金融機関によって購入可能投資信託等が決められてしまう、現在は凍結されている特別法人税で年1.173%の資産課税が行われる可能性がある、という欠点はある。その代わり、全額所得控除になって所得税等・住民税が安くなる、譲渡所得配当所得所得税等・住民税がかからない、受取時には退職金控除や公的年金等控除が使えるなど、税制面のメリットは大きい。

一般NISA: 対象期間が5年なのとそろそろ制度が終わるので、積極的選択する必要は無いかも。年間120万円と枠が大きかったり、外国株を含む個別株・ETF、つみたてNISA対象外の投資信託を購入できるメリットがある。税制面ではほぼつみたてNISAと同じで、譲渡益や配当金が非課税になる。

ちなみに、確定拠出年金 (iDeCo) はNISAのいずれか (一般/つみたて) と併用できる。

あと、国内外を問わず債券クラスを入れるなら確定拠出年金NISAじゃなくて、普通特定口座にしておいた方が良い。(枠に余裕がある場合を除く) 債券のリターンは小さいので、税制優遇される口座等の枠を使うのは勿体ない。

「〇〇の方がいいよ」

日本株新興国株は不要という宗派の人は好きなものを買えば良いと思うけど、MSCI All Country World Indexのうち日本は8%程度、新興国株は十数%だから、極端な違いは無いと思う。(日本株を入れるとブレが小さくなり利回りが低下、新興国株はブレが大きくなりリターンが向上する傾向)

米国株のリターンは素晴らしいし個人的には好きだけど、無難にいくならきちんと分散した方が良いと思う。ちなみに、MSCI All Country World Index米国が半分以上占めてるので、現状ではかなりの部分を依存していることになる。(米国落ち目になれば、構成比も変わっていくだろうが。)

他の資産クラスを含めた方が良いという場合は、eMaxis Slimバランス (8資産均等型) をおすすめしておく。バランスファンド信託報酬が高いことが多いけど、これは激安だしリバランス不要というのは素晴らしい。ただし、資産配分に納得できる場合に限る。

ETF (上場投資信託) の1348 (MAXIS トピック上場投信) を薦めている人がいるけど、出来高が小さくて流動性が低いので止めておいた方がいい。ETFを薦めるなら野村の1306 (TOPIX連動型上場投資信託) だけど、eMaxis Slim TOPIX信託報酬が十分安いからそっちで十分だと思う。

金やコモディティはお好み次第だけどそれ自体利益を生み出す仕組みじゃ無いから、個人的には不要だと思う。

ETF vs. 投資信託

ETF長所リアルタイム指数対応した投資信託を購入でき、信託報酬が安めであること。短所は実際の指数との乖離が発生する (特に出来高が小さい場合乖離率高めの傾向がある)、株式売買手数料がかかる場合があること、1円単位ではなく口数売買になること。

投資信託場合、1円単位で購入できて (最低金額はあるが) 積み立てしやすいこと、購入手数料がかからないものが多いこと。欠点現金化に数営業日かかる点。

現時点ではETFを選ぶ理由は乏しい。ETF分配金を出すので、住民税申告不要制度を使って節税するというテクニックに使うのは良さそう。(cf. https://www.smbcnikko.co.jp/service/mailmagazine/1701/r55/0727/top.pdf) あとは、米国ETFには面白いものが多いので、そのあたりを狙うなら良いけど中級者以上向け。

資産クラス別のリターンとリスク管理

このグラフを見れば株式の優位性は一目瞭然。ちなみに、縦は対数軸。

https://twitter.com/hirayasu/status/947530004237238273

一時的暴落することもあるので、リスク管理重要。無リスク資産である預金や、リーマンショックでも無風だった国内債券などもある程度持っておく必要はある。

面白く無い?

はっきり言って堅実すぎて面白く無い投資です。

なので、許容出来る程度にスパイス (米国面白いETFとか、個別株とか) を入れるのもいいよ。

資産が目減りした!

目減りしても許せる程度にリスクコントロールしましょう。

ただし、目減りしにくい (リスクが低い = 標準偏差が小さい) 金融商品はリターンも小さいので。(市場が「リスクプレミアム」を勘案して、自然とリターンが決まっていく。)

あと、リスク管理資産全体で見ること。株式評価額50%下がっても、資産配分が10%なら、たった5%しか影響受けていないので。

同じようなETF/投資信託がたくさんあるけどどれを選ぶべき?

eMAXIS Slim 全世界株式オールカントリー)かeMaxis Slimバランス (8資産均等型) を選んでおけば無難だけど、色々手を出したければ、基本はインデックスに連動するもの

おすすめシリーズとしては、

アクティブ投信は平均的には手数料分だけインデックスに負けるのでおすすめしない。

俺、家を買うんだ

持ち家の満足感が高いことは知ってるから止めはしない。

でも、ローンで持ち家を買うということは、レバレッジをかけて単一不動産投資しているということを忘れずに。

id:kiwamaru100 家を買うのは資産形成といより家族への生命保険みたいなもんじゃない?死んだらローンなくなるし。

id:hanagesan ただし不動産に関しては団信による生命保険としての側面と住宅ローン減税の話がないのは不親切

かに不親切でした。

銀行から投資信託金融商品を勧められた

ゴミ商品しか売りつけてこないよ。最近はさすがに変な仕組債を売りつけるようなことはしていないと思うけど。

有益アドバイスをくれるわけじゃないし、ネット証券で十分。

付き合いなどがあってどうしてもという場合でも、信託報酬率が0.5%を超えたらアウト。購入時手数料がかかるものも論外。

ソーシャルレンディングは?

一応国内債券の分類になるんだろうけど、その仕組み上中身が見えなくてリスクも高い。(そもそも借り手は銀行から融資を引けなかったところなので)

去年、みんなのクレジットラッキーバンクが詐欺まがいなことをやって大炎上した。

暗号通貨 (仮想通貨) とかFXってのが儲かるらしい

あれはギャンブル

遊び程度にやるなら止めはしないけど。

出口戦略

TODO: 老後に書く

おへんじ

id:baca-aho-doji 銘柄はもうちょっと攻めても…と思うけど。

初心者無難に積み立てる場合アドバイスなので、中級者以上なら俺の最強ポートフォリオ資産配分しても良いですね。

自分場合は、eMaxis Slimや購入・換金手数料なしシリーズで、米国株式・国内外REITを高めの比率で入れてます。あとは、米国ETFでセクタ投資。(VDE, VHT, VDC)

id:wow64 半年で1.5%ほどにしかなってないようだけど

平均なのでそんな時期もあります。(場合によっては損失が出る) それがリスク資産なのです。

年末ガクッと下がったしね。

id:sotonohitokun いや、内容に異論サラサラ無いが、今は時期悪いだろう。初心者は持ち金全部ツッコミがちだし、含み益ありゃ耐えられる人も一気に3割減ったら耐えられないって人が大多数。この手の投稿暴落時にUPがより良いよ。

いきなり含み損出すのは初心者の躓くポイントになりがちだけど、「良い時期」なんてのは誰にも分からないもので。(そんな時期が分かれば今頃一財産作って一日中はてブする生活してます。:-p)

id:chiusagi この記事山崎元が書いたのかな?

山崎さんのスタンスはかなり同意するところが多い。ただ、国内株式割合が多め (5割前後) としているのはあまり同意できないところ。ちなみに、山崎さんがじぶんで買っているのはバンガードのVTで、eMAXIS Slim 全世界株式 (オールカントリー) はそれに近い。

id:khtno73 ローリスク・ローリターンで預金よりマシな預け先をみんなが欲しがっている。

安心と信頼の国内債券

具体的には信託報酬も実質コストも最安のeMaxis Slim 国内債券インデックスオススメしておくよ。もちろん値動きはあるからリスクは0じゃないけど、かなりマイルド。利回りは年1〜2%程度だが、標準偏差は2〜3%程度 (近年で言えば2%未満) でリーマンショックでもほぼ無風。

商品は違うけど、同じNomura-BPI総合投資信託の動きを見れば一目瞭然。(eMaxis Slimならさら信託報酬率が低いので、これよりもややリターンが上回るはず。)

https://www.nomura-am.co.jp/fund/funddetail.php?t=2&fundcd=400039#fundinfo

10年分だけど、TOPIXとの比較

https://stocks.finance.yahoo.co.jp/stocks/chart/?code=0331309A&ct=z&t=ay&q=l&l=off&z=m&c1=&c2=&c3=&c4=&y=on&bc=

id:sewerrat課税NISAで株以外の資産が入るバランスファンドを買うのは非効率しかない。リバランス保有資産全体で考えればいい話で、NISA枠内でリバランスする意味はない。

正論。きちんとリバランスできる人は、上でも書いたように債券クラス課税口座に入れるべきですね。債券無しのバランスファンドが無いので、初心者向けのリバランス不要投信としてオススメしてます!

id:bokukanochat ウェルスナビとかはどうなの偉い人

投資信託信託報酬が年0.1%を目指す勝負をしている事態に、1%を払うのはもったいないと思ってる。

個人の感想です

ドルコスト平均法

実際の投資においてあまり意味が無いというのはよく言われているけど、心理的にはすごく重要。大してデメリットも無いし、下落したり含み損が出ても「今月、来月と安く買える」と踏みとどまれるので。まあ、普通の人は積立していくことになるので、結局これになるんですけどね。

moxsex よくわかんねえから初心者向けの本かなんか教えて

山崎元の本を買うといいよ。上にも書いたとおり国内株式割合が高すぎると思うけど、投資スタンスは間違いない。※個人の感想です

id:kibiya 皆さん為替リスクって知ってますか?

為替変動リスク株式などと比べて小さいので、無視できるとまでは言わないまでも長期投資であればそれほど気にしなくても良いと思う。長期で見れば、様々な指標に織り込まれるし。

id:hineno7 手元にもうちょっと大きな金額(2000万くらい)あるときは、どうしたらいいか教えてほしい…。毎月チマチマ積み立てるのも、運用していない金が出てきて、もったいない気がしている

時期を分散したいということであれば、国内債券投信 (具体的にはeMaxis Slim国内債券) を買って取り崩していくのがよさそう。(時期を分散することにあまり意味は無いと言われているけど、安心して投資できることはとても重要)

id:Ez-style ETF投信言及するなら、保険検討対象に入れた方がいいかもね。

ジャパントラディショナル生命保険資産形成に向いていないですね。予定利率が低すぎるし、満期前の解約返戻率がゴミなので。保険機能しかない掛け捨ての保険に入っておくのがベストだと思ってます独身なら共済で十分で、共済によってはお安くスーツを作れたりするのでいいですよ。(都民共済スーツを愛用してる。)

生命保険料控除の枠が余ってるなら、明治安田生命の「じぶんの積立」に月5000円だけ加入しておくと、毎年1万円くらい税金がお得になります。(金額は人による。年末調整で紙を出すだけ) この保険生命保険機能としてはゴミだけど、常に解約返戻率が100%以上になるし解約の制限も無く数日で換金できる、実質生命保険料控除でお得になるためだけの保険。ほぼ現預金と同じ扱いで良いけど、預金保護対象では無い点に注意。

id:invoicekun 人気が出た金融商品のリターンは激減するという研究があるけど(ひふみ然り)、つまりはそういうことなのでは無いかと思う

その手の投資信託基本的中小株式がリターンの源泉で、総資産額が増えるほど身動きが取りづらくなって (自身の売買で株価に影響が出やすいので) かつてのリターンが得られない状態になりがち。

一方、インデックス投信中小株を大量に売買するという極端なことはやらないので、基本的にはそのような心配不要です。

id:kyo_ju 学生時代からの知人がWeb上の日記で"手仕舞い"やら"建て玉"やらという言葉日常的に使いだした時点でそっと縁切りしたぐらいの人間だし、株価で支えられてる政権と利害一致なんざ死んでも嫌なので手は出せんな。

ジャパンが嫌いなら、「eMaxis Slim 全世界株式 (除く日本)」あたりがおすすめだよ。

id:NOID2017 じぶんの積立、生命保険料控除にはいいけど若干面倒なのが面談必須なところ(2年前?くらいの情報なので変わってたらごめんなさい)

今でも面談必須だと思う。(特にしつこい勧誘は無かった)

id:elm200 債券が本当にそこまで安全かは疑問。

個別債券はともかく、NOMURA-BPI総合に連動するような投信ならリーマンショックにほぼ影響されなかった実績がある Permalink | 記事への反応(16) | 21:55

2019-05-29

anond:20190529133547

じゃあこれは輸送業の人がすべきTODOということで終了

ここは争わない。実際そうするべきだ

その不利益の内訳を明確にして、それぞれ問題改善すればよいのではと思うのだがいかがか。

その労力すら無実無関係男性には負う義理義務メリットもない。

なぜ自分への差別正当化を行わねばならない?

とは言いつつ、さんざん書いてるぞ。不利益については。

女性専用車両になっている車両にどうしても乗りたいということ?密度が同じなら、どの車両に乗っても変わらないと思うが・・・

選択肢問題であり、また「排除」という差別問題である

「変わらないからオッケー」じゃないぞ。

から受忍限度はそういうたぐいのものではない。そんくらい我慢せーよ、ということ。

女性専用車両ができて圧迫が本格的に苦痛!は分かるが、女性専用車両じゃないとこに行かなきゃならない!

なんてそのくらいせーよ、どんだけものぐさだってこと。

無実無関係男性には一切負担を強いられる義務義理もないため、「そんくらい我慢せーよ」などと言われる謂れもない。

何様が「そんくらい」なんて決めてるんだ?

差別には「そんくらい」なんてない。

なぜ分かった。でもこれは言葉遊びではない。「差別」という言葉自身を悪になっていることによる議論の進まなさに辟易している。

問題は「不利益」そのものにあるはずなんだ。

属性理由不利益を与えること」=「差別なのだから、言い換えてるだけだろ。

だれも「あなた痴漢です」なんて言っていない。確認してみたらいい。

車両から追い出されても、別の車両に乗れる。別の車両はたくさんあるよね?

言ってなくても行動で示してる。排除するとはそういうことだ。

「別の車両に乗れる」?ナンセンスだ。無関係男性にはそもそも追い出されるべき理由がない。

ヒアリング調査はすべて無効、というのはさすがに問題だ。物証できないものは全て「ナシ」とするのであれば、

痴漢という犯罪行為は「ナシ」と言ったもん勝ちにもなるだろう。

現状の男性差別享受してる女性ヒアリングしても、既得権益を守るためどんなことでもいうだろう。

痴漢接触を伴う以上、物証は残る。

逆に物証がないものは「痴漢」と確定できない。推定無罪

anond:20190529131933

引用記法を真似しようと思ったけどうまくいかない。。

2019-05-19

https://anond.hatelabo.jp/20190519110033

ブコメ

todoリストを作れ。期限と優先順位を明記し、毎日更新しろ。大きな仕事の空き時間に細かい仕事をやれ。人に頼まなきゃいけないことは真っ先に頼め。メモ紙に書いてパソコンに貼っとけ。俺はそれでなんとかなった

とかあるが、

todoリスト無能ゆえ問題解決できない&先延ばししまくるためリストが膨大になり最終的に放棄される。

大きな仕事の空き時間に細かい仕事をやれ→発達には優先順位なんてつけられないから無理。

   大きな仕事も細かい仕事も等しく同じに見える。

人に頼まなきゃいけないこと→発達だから人に頼むのにすごい労力を使う。

   仕事の依頼をすると相手から「何言ってんのか意味からない」といった顔をされるから、なんて説明したもんかすごい考えるけど

   だったら自分でやったほうが早くねってなって結局自分todoに追加される。

メモ紙に書いてパソコン→書いてもメモ用紙を見ない。

   上司にあれどうなったといわれて、なんか聞いたことあるなと思ってふと手元を見るとパソコンに張ってある。

なんだよな

つらい

2019-05-05

人生タイミングがズレている

10連休ぼんやり人生を振り返った。こういった要因でタイミングを逃したりズレてしまっている。

やるべきタイミングちょっとでもプレシャーがあると行動中毒に逃げてしまい、プレシャーが無くなってからやり始めると旬が終わっている。

意識できないほど全力でやれば結果が出るが、良い意味でも悪い意味でも期待やプレッシャーがかかると勝率が下がる。

ストレスプレッシャーから逃げてしまう。逃げ癖とも言われている。

やるべきタイミングに限ってなにかしらちょっとしたハードルがある。

今だ!ってタイミングで、気持ちが乗らない。だるい。天候や体調が悪い。また今度にしようか、先延ばしを考えてしまうが

こういう時こそがんばると後々やっといてよかったと思えることが多いので良いタイミングサインだと思ってやるようにしている。

行動中毒。つまらないのにやり始めて、やめたくてもやめられない。(行動と報酬が結びつくもの仕事中毒ゲーム中毒)

急に退屈に耐えきれなくなったり、ゲームのことを急にフラッシュバックしてしまうと、ゲーム我慢できなくなってしまゲームに手をつけてしまうと、日に日にプレイ時間が伸びてやめられなくなってしまう。

止めるためには、数日間ゲームに触れない。禁断症状はつらいが数日で消え失せる。

面白くなくてもやってしまうところが問題

衝動的にならず、目的を決めてほどほどにやれればいいのだが。今できていない。

こう書いてみて思うこと

この3点だろうか

2019-05-02

TODOコメントについて

// TODO(masuda): ここにうんこを書く

みたいに自分名前併記しとくと便利って言われたので今度試す。

2019-04-23

なぜ俺はVTuberにハマってないんだ

人間に似た外見を持つ人工的なものがまるで人間のように振る舞おうとする姿」が好きだ。

有名どころだとスター・ウォーズにおけるC-3POだったりL3-37(泣いた)だったり。

HUGっと!プリキュアルールー・アムール/キュアアムールアンドロイドでありながらプリキュアに変身することができた。泣いた。

この前たまたま日本科学未来館に行く機会があって、全くノーチェックだったけどオトナロイドオルタを見た。オトナロイド椅子に座った女性遠隔操作ロボットで、声は実際の人間ボイチェンで出してるだけ。オルタ上半身だけ、しかも半分機械がむき出しで、センサーによって前を通る人とかを認識して顔や手が動くけどそこまでインタラクティブ感はない。でも泣いた。

もう10年以上前になるけど初音ミクの登場も衝撃的だった。イラストがついたシンセサイザー自分自身や愛や有象無象を歌っている。泣いた。(Todo: 週末はM3ニコニコ超会議に行くぞ)

で、

そろそろキャズムを超えそうなVTuberである

いわゆる四天王とかそういう呼び名があるのは知ってる。その人達動画はそれぞれ数個見た。親分はたぶん10個くらい見た。

でもそれ以上なかなか続かない。

これまでの自分趣味から理論的に(?)考えると絶対ハマりそうなのに、ちょっと動画見ただけで満足というか、もうこれ以上はいいかな...と思ってしまう。

自分は未だVTuberというものに対する本質的な何かを見抜けてないのか。もしかして自分に刺さるVTuber(、が誰だかわからないけど)を見つけてないだけなのか。もどかしい

2019-04-18

個人的就活まとめ

就活終えたのでまとめとして自分が何したかを書いてみたけど投げるところもないのでこちらへ。

IT系大企業の話なので他の業界だと違うかもしれません。あと就活開始当初からほぼITに絞っていたのでインターンの話は業界が決まってる人向けかもしれないです。

誰かの役に立つといいな。

インターン

長期ではなく1,2日くらいの短期間のやつでも早期選考に乗れることがあるので本命なら行っておくべきだし、本命と同業種のところもできれば参加しておきたい。そこで会った社員の方の名前お話した内容は絶対メモっておく。長期でやらかすと選考にも影響するって噂も聞くけど短期ならまあ大丈夫(だと思う)。グループワークで成果を上げるよりもその会社とのつながりを深めることを重視。

ESや適性検査面接といった選考有りのインターンも受けとくだけで選考に慣れるのでおすすめ。本選考より倍率は高いので落ちても気にしない。


ES

幼少期から今までの出来事やその時の気持ちを洗い出すってやつ、軽くでもやっておくと後々役立つ。ESでも面接でも"自分だけの体験+その場の感情や考えの変遷"をアピールできるとつよい。

ESを元に面接される場合ほとんどなので志望動機以外のエピソードはなるべく同じものに揃えておくと楽。同じ体験を使って会社雰囲気によってちょっとだけ結論(その体験から得られたもの、とか)を変えるくらいで。同じエピソードを使いまわしておくと色んな面接で同じ体験を深掘りしてくれるので数をこなすごとに深掘りに耐えられるようになってくる。その会社ESには書いていなくてもふとした質問に対して具体的な体験談をぶつけていけるのでつよい。ESを書くために拾い出した過去出来事達も想定外質問の答えの役に立ったりするのでおすすめ

結論ファーストで書くこと。きちんとした文になっているか、誤字脱字はなるべく日を置いて確認すること。(とはいえ自分も締切ギリギリに書き上げたのがほとんど)

文末の工夫として"考える"、"思う"以外の語彙を増やす。"確信している"とか"期待している"とかポジティブ感があるものおすすめ。"強く"、"深く"、"心から"みたいな副詞有効的に使うと論理的文章の中にも熱意とか人間味とかが伝わる気がする。

あと提出するESちゃんと記録しておくこと。自分就活関係は全部Evernote管理していました。

・適性検査

がんばれ

面接

緊張しやす性格だったので最初の方の面接は全滅。緊張は仕方ないとはいえ場数を踏めば多少は慣れるのでやはり場数こなすべきかも。ここで本命インターンしか行ってないと早期選考のせいで初めての面接第一志望!ってことになりかねないので(自分はそれで死んだ)他社のインターンも行っておくことを改めておすすめしたい。それか外資とか選考が早いところで慣れておく。

→準備

〇ンキャリ辺りで過去質問やその傾向を拾い上げてくる。自己PR志望動機+過去質問パターン+逆質問の準備で大体なんとかなる(ならないこともあるけど)。

そして想定される質問文に対してどう答えるかを提出したESも踏まえて考えてひたすらEvernoteに書き出す。どうゆう答えをしてその理由にどの体験を持ってくるか、さらにその体験でどう考えていたか台本を書くつもりで全部文章にする。そしてそれをひたすら音読する。

緊張しがちで頭回らなくなるタイプなので準備は(面接当日の1時とかからだけど)きっちりやりましたがこの辺の必要性は人による気がする。あと軽く吃音があって緊張するとそれが出てしまうことがあるので音読で口を慣らすのはマストでした。会社に行く電車の中でも書いた文章読み返しながら小声でモゴモゴしてたのでマスクしていたとはいえ怪しい人だったかもしれないけど人生がかかってるから許してほしい。

面接に向けた企業研究会社HPから社長メッセージ中期経営計画決算報告、新しめのプレスリリース辺りを見てました。

あとはアピール方法として"御社自分との関わり"を押し出していく。インターンでも面接でも、"御社の〇〇さんに座談会でこういう事を聞いた"、"1次面接の△△さんのこういう考え方に共感した"みたいな具体的なアピールをしておくと志望度が高く見えるし、面接官がその人を知っていると共通点として盛り上がれる。製品を知っている事を求められそうなら調べておく。何か小さい頃に使ってたとか最近思わぬところで社名を見たみたいなエピソードはそこそこ使える。

面接

なるべく笑顔とはいえニヤニヤしてても気持ち悪い気がしたので自分はひたすら期待の眼差しを向けていたつもり。

答えに詰まった時は"一旦落ち着かせてください"って言って時間をもらったり、それでも頭が真っ白になったままの時はとりあえず話し慣れているエピソードを話し始めてその途中で"質問なんでしたっけ?"みたいに聞き返ししてから無理やり結論をそこに着地させたり(今思えば論理性皆無)。詰まってもこれで切り抜けられた事はあります。(もちろん容赦なく落とされることもある。)

面接官と共通話題を見つけて盛り上がられると楽しく面接を終えられて気が楽です。大抵最後逆質問なのでそれがうまくいくと印象が上がる気がするので前半詰められてもなんとか挽回できます

逆質問事業内容について聞くと下調べが甘いのがバレるので面接官の方の働く上での心持ちだとか将来期待していることとかそういう個人的な事を聞いていました。あとは自分が他社にもらった負のフィードバックや悩みに関して改善方法を聞いてみたりしました。この辺は居酒屋上司相談するくらいの気持ちで。

面接

面接官の名前絶対覚えておいて面接終わったら即メモ。帰りの電車で聞かれた内容とそれに対してどう答えたかをひたすら書き出す。これをやっておくととりあえず反省点が見つかるのと次の面接でも答えが矛盾しなくなる。面接増えてくるとどこで何の話したのかわからなくなるので必須。次の面接に進めたらこメモも見返してまた準備を、の繰り返し。

・まとめ

和やかな面接に当たることが多かったので就活中結果を見るのは辛かったけどそれ以外は大体楽しかった。色んな企業本社見れてラッキー!って思ってたし逆にべ〇サールとかで説明会する会社クソって思ってた。本社入れてくれや。

基本Evernoteタスク管理ES面接準備をしていました。会社ごとにノートブック作ってそこにtodoとかESとか面接内容とか全部ぶちこんでました。todoリストにはタグつけてtodoリストだけ一覧表示できるようにしてたりtodoリスト題名会社名と次の日程と用事(【4/2ES締切】〇〇社)入れておくと一覧で見た時に各社次にやることがすぐわかって楽でした(伝われ)。Evernoteの良いところは家でも電車でも色々書けるところと企業webページをそのままクリップできるところ、不便なところはES書くにあたって文字数が数えられないのと文章校正機能がないところ。

純粋に色々な人の話を聞けるという意味では就活は楽しかったです、とはいえ結果出るまではクソ辛い。

2019-03-25

アナログの付箋のToDOリストの何がいいか

ここがいい

1 視覚による外部入力になる

2 脳内のいろいろゴチャゴチャしたしがらみから切り離す事ができる

3 解像度が非常に大きい世界オブジェクトなので、周辺視野に入りやす

4 ToDOを直前まで忘れていい。むしろ覚えてたらダメ

5 終った後にはがすのが気持ちいい!

ここがダメ

1 書き出すのがめんどくさい

2019-03-12

自分用にTODOアプリを作ることにした

1日で作ろうとしたけど終わらなかった

 

TODOアプリをつくるTODOを作らなければ

2019-03-04

新生活のために、自分たちの振り返り。

先日、友人から相談を受けた。

彼はそろそろ結婚を考えており、条件が近い私に生活必要もの&ことを聞きたいそうだ。

そのときに話した内容を備忘録としてまとめておく。

私の現状

都内社会人数年目、結婚2年目の20代後半。子なし、共働き。2人ともIT系会社員

結婚前までお互い実家ぐらしだったので、家事は手伝い程度。

自分たち基準としては2DK以上。細かい条件は2階以上とか、洗面所独立とか。こういった条件はお互い出し合いつつ、スーモホームズを見ながら少しずつ固めていった。

間取り図を見て家具配置を考えたところ、40平方メートル以上が条件に加わったりもした。

あとはお互いの職場から距離と、予算で最寄り駅を決めて、数件の物件内見し決定。

このあたりは普通の決め方だと思っている。

2DKで、ダイニング、寝室、作業部屋(机と本棚)みたいな構成になっている。

現状の反省点としては、使わない部屋ができていることだ。ダイニングにテーブルTVを置いてあり、テーブル作業したりご飯を食べているので作業部屋とは言ったが実質物置部屋だ。

活用するための施策現在募集中

購入した家電家具

大きいものは、TV冷蔵庫電子レンジトースター炊飯器、ガステーブル、ポット、テーブル、棚類、空気清浄機洗濯機、布団乾燥機

エアコンとか照明は付いている賃貸だったので未購入。

こだわった点は以下。

良かったのは、布団乾燥機暖かい布団は冬最高なこと。また、ドラム式もきっちり乾くので平日日中に動かして、帰宅後に取り出している。

反省点としては、オーブントースターが便利なのでそこまでオーブン機能を使わないところと、冷蔵庫は350Lだと少し小さいと感じている点。

食洗機はまだ導入できていない。キッチンが狭いので置くところがない…

あとは最近自動調理鍋がほしい。共働きだと煮込む時間取りにくくない?

家事負担

基本的には半分ずつだが、きっちり半分にしていない&妻のほうが気が利くので相当負担させてしまっている。この辺は反省点であり、できる限り自分からやるように心がけている。

見える化のために付箋によるカンバン方式家事全般に導入検討中(後述)。

食事については、ご飯味噌汁は用意している。メインは気が向いたときだけ作り、基本はスーパーのお惣菜

昼は各自社食があるし、朝はグラノーラパン。妻が早く起きると目玉焼きを焼いてくれるので好き。

土日はネットで気になった料理に挑戦してみたり、外食に行ったりする。

夫婦間での情報共有

やっていること

うまく行っているのはTodo管理アプリファイル共有。Todo管理では、洗剤や醤油、食べたいものなど何でも入れておき、帰宅時にどちらかが消化する。粒度を揃えたりせず、ざっくばらんに入れることで長続きしていると思う。

ファイル共有は主に購入したい家電と今住んでいる家を決定するとき比較表や、家計簿的なものが詰まっている。買ったときの所感が残っていると数年後の買い替え/住み替えに便利…と信じている。

うまく回っていないのはGoogleカレンダー。お互いそんなに出かけないので、把握できる量の予定しかなかったため自然と使わなくなった。仕事で遅い日は連絡とり合っているので問題なかったりする。もう少し複雑になってくるともっと必要になるのかも。

家事カンバン付箋だが、これは最近始めたのだが割とうまく回り始めた(と思っている)。現在は大物(週1の風呂掃除など)を貼っておき、やったら剥がしていく。土日に何を片付けたかがわかりやすくなり、モチベーションも保ちやすい。

今後は1週間分の家事を付箋にしておくように拡張予定である。これにより、お互いどれくらい家事をやったか見える化可能で、よく気が利く妻が負担していた家事を半々に持っていきたい。

まとめ

あくまで私の家の現在方法をまとめたわけで、今後子どもができたりするとまた変わっていくと思う。

1年に1回はこういう振り返りをして、改良策を出していきたい。

2019-03-03

anond:20190303141115

毎日todoリストを書くクセをつけることだな。

75mm x 75mmの付箋を常備して、ちょっと作業の順番が混乱してきたなと思ったら走り書き的に整え直す。

だっと抱えてる仕事を書き出して、締切や優先度を踏まえて、順に番号を振って、その番号順に仕事をする。場合によっては元の人や他の仕事仕事を投げる。

かい仕事ポンポン舞い込んでくるということは、逆に、捨ててもいい仕事もいっぱいあるはずだ。

2019-02-17

ToDoに「小便する」とか「大便する」って書いている

書いてないと忘れてしまうので

2019-01-03

anond:20190103184241

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//

	int blocks[100][100];

	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);
		x = 0;
		y = 0;
		boxType = 0;

		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		for(int x = 0 ; x < 100 ; x++)
		{
			for (int y = 0; y < 100; y++)
			{
				blocks[y][x] = 0;
			}
		}

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int x;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 100 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	int boxType;

	BOOL WriteBoxOLDBox()
	{
		int width = 24;

		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 48));
		for (int y = 0; y < 30; y++)
		{
			for (int x = 0; x < 8; x++)
			{
				if (blocks[y][x] == 0)
				{
					continue;
				}

				RECT Rect = { 0,0,48,48 };
				BOOL ret;

				Rect.left = width * x + 1;
				Rect.right = width * (x + 1) - 1;
				Rect.top = width * y + 1;
				Rect.bottom = width * (y + 1) - 1;

				ret = FillRect(hdc, &Rect, hBrush);


			}
		}

		DeleteObject(hBrush);

		return FALSE;
	}


	BOOL WriteBox()
	{
		WriteBoxOLDBox();

		switch (boxType)
		{
		case 0:
			return WriteBoxI();
		case 1:
			return WriteBoxL();
		case 2:
			return WriteBoxZ();

		}

		return TRUE;
	}

	BOOL WriteBoxZ()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left += width;
		Rect.right += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);


		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL WriteBoxL()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 246 , 48));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) -1 ;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) -1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top    += width; 
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left   += width;
		Rect.right  += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL WriteBoxI()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB( 246 , 48 , 48));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		//Rect.left   += width;
		//Rect.right  += width;
		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL SaveBoxI()
	{
		blocks[y  ][x] = 1;
		blocks[y+1][x] = 1;
		blocks[y+2][x] = 1;
		blocks[y+3][x] = 1;
		return TRUE;
	}


	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		if (x > 8) {
			x = 0;
		}
		if (x <0) {
			x = 8;
		}
		if (y > 20) {
			switch (boxType)
			{
			case 0:
				SaveBoxI();
				break;
			case 1:
				break;
			case 2:
				break;
			}

			y = 0;
			boxType++;
			if (boxType > 2)
			{
				boxType = 0;
			}
		}

		this->WriteBox();

		return TRUE;
	}



	BOOL OnKey(WPARAM wParam)
	{
		if (wParam == VK_LEFT)
		{
			x++;
		}
		if (wParam == VK_RIGHT)
		{
			x--;
		}
		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
		break;
	case WM_KEYDOWN:
		{
			MyWindow *target = MyWindow::find(hWnd);
			target->OnKey(wParam);
		}
	break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

anond:20190103170543

テトリス

落ちてくるブロックの描き方

わかりやす関数化してみた

まずはブロックの種類は3種類

 

WriteBoxLとWriteBoxIとWriteBoxZ

の違いをよく見比べて

自力で違いがわかれば

プログラマーにはなれるとおもう

とはいえ、コレを自力でわかるならもっと儲かる仕事あるとはおもうけどな

 

	BOOL WriteBox()
	{
		switch (boxType)
		{
		case 0:
			return WriteBoxI();
		case 1:
			return WriteBoxL();
		case 2:
			return WriteBoxZ();

		}
	}
// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);
		x = 0;
		y = 0;
		boxType = 0;

		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int x;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 8 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	int boxType;

	BOOL WriteBox()
	{
		switch (boxType)
		{
		case 0:
			return WriteBoxI();
		case 1:
			return WriteBoxL();
		case 2:
			return WriteBoxZ();

		}
	}

	BOOL WriteBoxZ()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left += width;
		Rect.right += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);


		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL WriteBoxL()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) -1 ;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) -1;

		ret = FillRect(hdc, &Rect, hBrush);


		Rect.top    += width; 
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left   += width;
		Rect.right  += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL WriteBoxI()
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));

		int width = 24;

		RECT Rect = { 0,0,48,48 };
		BOOL ret;

		Rect.left = width * x + 1;
		Rect.right = width * (x + 1) - 1;
		Rect.top = width * y + 1;
		Rect.bottom = width * (y + 1) - 1;

		ret = FillRect(hdc, &Rect, hBrush);


		//Rect.left   += width;
		//Rect.right  += width;
		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		if (x > 8) {
			x = 0;
		}
		if (x <0) {
			x = 8;
		}
		if (y > 8) {
			y = 0;
			boxType++;
			if (boxType > 2)
			{
				boxType = 0;
			}
		}

		this->WriteBox();

		return TRUE;
	}



	BOOL OnKey()
	{
		x++;
		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
		break;
	case WM_KEYDOWN:
		{
			MyWindow *target = MyWindow::find(hWnd);
			target->OnKey();
		}
	break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

anond:20190101175055

テトリス風?プログラムに向けて

第何回だろうな

キー入力を追加した

まだ、何を押してもブロックが右に移動するだけ(右端にいくと左にワープ

タイマー自動落下

 

でもまぁ ここまでサンプルがあるとほぼテトリスは見えてきた

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);
		x = 0;
		y = 0;

		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int x;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 8 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));
		RECT Rect = { 0,0,48,48 };
		Rect.left = 48 * x;
		Rect.right = 48 * (x+1);
		Rect.top = 48 * y;
		Rect.bottom = 48 * (y+1);
		if (x > 8) {
			x = 0;
		}
		if (x <0) {
			x = 8;
		}
		if (y > 8) {
			y = 0;
		}
		BOOL ret = FillRect(ps.hdc, &Rect, hBrush);
		DeleteObject(hBrush);

		return TRUE;
	}

	BOOL OnKey()
	{
		x++;
		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
		break;
	case WM_KEYDOWN:
		{
			MyWindow *target = MyWindow::find(hWnd);
			target->OnKey();
		}
	break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

2019-01-01

anond:20190101172100

タイマーを使ったアニメーションを付けた

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);
		y = 0;

		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;
	BOOL run;
	int y;
	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));
		run = true;
		int rc;
		// メイン メッセージ ループ:
		while (run)
		{
			DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL,  100 , QS_PAINT| QS_ALLEVENTS,0);
			if (obj <= WAIT_OBJECT_0)
			{
				while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&msg);
					}
					if (msg.message == WM_QUIT) {
						run = FALSE;
					}
					if (msg.message == WM_CLOSE) {
						run = FALSE;
					}

				}
			}
			else if (obj == WAIT_TIMEOUT)
			{
				y++;
				PAINTSTRUCT ps;
				HDC hdc = BeginPaint(hWnd, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48,48 * 8 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		HDC hdc = GetDC(hWnd);
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));
		RECT Rect = { 0,0,48,48 };
		Rect.top = 48 * y;
		Rect.bottom = 48 * (y+1);
		if (y > 8) {
			y = 0;
		}
		BOOL ret = FillRect(ps.hdc, &Rect, hBrush);
		DeleteObject(hBrush);

		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

anond:20190101162210

やすいように フルソー

青い■を表示するだけ

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);


		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;

	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));

		// メイン メッセージ ループ:
		while (GetMessage(&msg, nullptr, 0, 0))
		{
			if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		}


		return TRUE;

	}

	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));
		RECT Rect = { 0,0,48,48 };
		BOOL ret = FillRect(ps.hdc, &Rect, hBrush);
		DeleteObject(hBrush);

		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

anond:20190101162044

解説

この部分でfindを呼んで ペアのthis関数を見つけて

グローバル関数からクラスメソッドを呼び出す

実質このtargetがthisポインタ相当になって

this->OnPaintと呼ぶのと同じ効果を出してくれる

これがグローバル関数からクラスメソッド基本的呼び方になる

    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint();


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }

anond:20181231104029

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

#include <list>

class MyWindow;
	
std::list< MyWindow *> windows;

class MyWindow
{
public:

	HWND hWnd;



	MyWindow()
		:hWnd(NULL)
	{
		windows.push_back(this);
	}

	virtual ~MyWindow()
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			if (*it == this)
			{
				windows.erase(it);
				break;
			}
		}
	}

	static MyWindow * find(HWND key)
	{
		std::list< MyWindow *>::iterator it;
		for (it = windows.begin(); it != windows.end(); it++)
		{
			MyWindow *target = *it;

			if (target->hWnd == key)
			{
				return target;
			}

		}

		return NULL;
	}



	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);


		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;

	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));

		// メイン メッセージ ループ:
		while (GetMessage(&msg, nullptr, 0, 0))
		{
			if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		}


		return TRUE;

	}

	BOOL OnPaint()
	{
		return TRUE;
	}


};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint();


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}


Windowsシステムは基本 グローバル関数なので

グローバル関数<>クラス化されたメソッド

ブリッジ関数を書いた

2018-12-31

anond:20181228211250

// WindowsProject7.cpp: アプリケーションエントリ ポイント定義します。
//

#include "stdafx.h"
#include "WindowsProject7.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;                                // 現在インターフェイス
WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーテキスト
WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名

// このコード モジュールに含まれ関数宣言転送します:
//ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);


class MyWindow
{
public:

	HWND hWnd;

	MyWindow()
		:hWnd(NULL)
	{

	}


	//
	//  関数: MyRegisterClass()
	//
	//  目的: ウィンドウ クラス登録します。
	//
	ATOM MyRegisterClass(HINSTANCE hInstance)
	{
		WNDCLASSEXW wcex;

		wcex.cbSize = sizeof(WNDCLASSEX);

		wcex.style = CS_HREDRAW | CS_VREDRAW;
		wcex.lpfnWndProc = WndProc;
		wcex.cbClsExtra = 0;
		wcex.cbWndExtra = 0;
		wcex.hInstance = hInstance;
		wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7));
		wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
		wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
		wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7);
		wcex.lpszClassName = szWindowClass;
		wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

		return RegisterClassExW(&wcex);
	}

	//
	//   関数: InitInstance(HINSTANCE, int)
	//
	//   目的: インスタンス ハンドルを保存して、メイン ウィンドウ作成します。
	//
	//   コメント:
	//
	//        この関数で、グローバル変数インスタンス ハンドルを保存し、
	//        メイン プログラム ウィンドウ作成および表示します。
	//
	BOOL InitInstance()
	{
		hInst = hInstance; // グローバル変数インスタンス処理を格納します。

		ATOM c = MyRegisterClass(hInstance);


		hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
			CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

		if (!hWnd)
		{
			return FALSE;
		}

		return TRUE;
	}

	BOOL ShowWindow()
	{
		BOOL ret;
		ret = ::ShowWindow(hWnd, SW_SHOW);
		::UpdateWindow(hWnd);

		return ret;
	}


	HINSTANCE hInstance;
	MSG msg;

	BOOL Main()
	{

		HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7));

		// メイン メッセージ ループ:
		while (GetMessage(&msg, nullptr, 0, 0))
		{
			if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		}


		return TRUE;

	}



};


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING);
    //MyRegisterClass(hInstance);



	MyWindow win;



	win.hInstance = hInstance;

	// アプリケーション初期化を実行します:
	if (!win.InitInstance())
	{
		return FALSE;
	}

	BOOL ret;

	win.ShowWindow();

	ret = win.Main();

	if (ret)
	{
		return 0;
	}else {
		return (int)win.msg.wParam;
	}



}






//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:    メイン ウィンドウメッセージを処理します。
//
//  WM_COMMAND  - アプリケーション メニューの処理
//  WM_PAINT    - メイン ウィンドウの描画
//  WM_DESTROY  - 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // 選択されたメニューの解析:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                DestroyWindow(hWnd);
                break;
            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);
            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

こんなかんじ。クラス化した

ログイン ユーザー登録
ようこそ ゲスト さん