はてなキーワード: ToDoとは
片足上げて30カウントするとめんどくささが消えるっていう記事がおもしろかった。
それの俺バージョンがある。
指を折り曲げる運動。
主に、一切の気力がなく横になった状態から動けないでいるとき、とりあえず起きて動けるところまで持っていくために使う。
手順。
親指から小指まで順番に曲げる。
手がグーの形になったら今度は小指から親指の順で開いていく。そんだけ。
脳内の「しなければならないこと」リストを一度全部きれいに忘れて、それだけできれば後はなんもしなくてもOKとリストを書き換える。
とにかく指の動きにだけ集中する。動きがシームレスになるまで続ける。
最初は片手だけ。勢いがついたら両手。
両手の指を動かすことからめんどくささが消えたら、次に手首を動かす。ぐるぐる適当に回す。スナップを効かせる。
手首の運動にも慣れたら今度は腕。適当にぐるぐる動かす。肩甲骨を巻き込んでいく。
腕の次は肩。ここまで動かせるようになったら、体を動かすアクションへのハードルがまあまあ下がっているので、勢いにまかせて上体を起こす。
上体を起こせたら、起こした体全体を揺さぶるようなイメージで動かしていく。気分はパリピ。
後は二本足で立つだけ!
以上。
立った後のことは考えない。きれいに消し去ったTodoリストをCtrl+ZしたのちShift+Deleteで根絶やしにしてもいい。しなくてもいい。生きてるだけでえらい!
いかに強迫的義務感にとらわれず過ごすかを意識しているが、それを意識しすぎる義務感にかられている気がしてきてやばい。
最近は、横たわって動きたくない状態のとき以外にも、なんか最初のアクションがめんどくせーと思ったとき、予備動作的ノリで指の運動をやっている。
作業行程を料理に見立てて、まず○○を用意します…などと虚空に向かって喋る。
全行程を、自分という視聴者に向けて実際の動きを見せながら説明していくイメージ。
おわり。
すごくズボラな俺だけど借金や自営化してとうとう頭だけで把握が無理になった
返済がもしなければ別に「なるようになった」でも良いかもしれないけど
さすがに適当にやると詰みそうだったので
(よく今まで詰まなかったな)
入金ルート(普通なら給料)がまず5ルートある、入金タイミングも違う
あと手持ちという列を作った(ここの管理がわかりづらい)
出金は、家賃・光熱費・クレカ・借金・生活費、くらいの粒度なのに14ルートある
普通はもっと「電気代」とか「食費」とかにするんだろうけど、ムリムリのカタツムリ
何でこんなに多いのかは、借り入れが複数なのと、税金などのせいだ(所得税・住民税・保険・年金などが個別に徴収されるせい)
不確定要素があったり、一旦金をどこから調達するかとかでぐちゃぐちゃ
予想と予定とシミュレーションと実績とTODOが混ざるからカオス
上手い人はもっと上手く書くんだろうか
書いてみた所感(3ヶ月)
・支払い忘れが無くなるのは良いと思った
・これ、家計簿アプリとかだとムリだわこの情報量、だから嫌いなんだよ既成品は
無茶すれば3月くらいには全部返せる
頑張ろう
ところでこれは家計簿なのか??
そこらへん分けないとなー(そんな余裕はない)
五日ほど前:足スッキリシートっていうのめっちゃ気持ちいい……貰い物だけどこれ最高だ。なんでこんな優れた人類の宝を私は今までスルーしてきたのか。切れちゃったし買ってこよう。
四日ほど前:会社でたからかに足スッキリシートがいかにすばらしいか気持ち良いか同僚に話し、大いに盛り上がって自分の正しさと叡智を再確認。良い気分で帰宅。→ほぎゃあああ!?買ってないよおおお!!
三日ほど前:忘れないようにランチタイムに昼を食べたついでに会社近くのドラッグストアで購入しようと心に決めるが、当てにしていた昼食屋さんが閉まっていて、見知らぬ居酒屋のランチ海鮮丼を食べている間に脳内は午後の回覧書類に専有されて購入忘却。ほみゃああ!?→帰り道に買えば何の問題もないさと自らをクールダウンするも冷静沈着になりすぎ、感情を失ったわたしは当然のように帰途も足スッキリシート購入を忘れてしまう。ほぎゃああ!?子供か。子供なのかわたしは。小学生以下の自分の知能と注意力にふかくふかく絶望する。
二日前:もうわたしはわたしを信じない。信じないつまり不信こそがライフハックなソリューション。スマホのToDoに行動予定を仕込み帰宅時間に合わせて自分に指示を与える遠隔操作。→会社最寄り駅で指示を受取り電車に乗って自宅最寄り駅に到着した時点で全て忘却。→ほぎゃあああわたしがうらぎったああああ。なんで足スッキリシート程度が買えないのおおおおお。
昨日土曜日:一日寝てて夜に起き出しコンビニで飯を買ってもそもそ食う芋虫のようなライフ。→眠りにつく直前。ほぎゃああ!?コンビニ行ったのになんで買ってこないんだよわたし!!
今日日曜日:会社の帰りとか言ってるからダメなんだ。そういう気持ちが足スッキリシートを遠ざけている。むしろ積極的に足スッキリシートを買いに行ってついでに昼ごはんを食べてこよう。→カレーうまかった満腹満腹!ついでに新刊書籍も買えて良いお出かけだった。やっぱダンゴムシのようなわたしでも週末引きこもりは良くないね~たまには出かけなきゃねー。ただいまー→ほぎゃややああああ足スッキリシート買うの忘れてるうううう!!!???ばかばかばかばか、しねわたしーーーーー!!!
初心者がどのように投資して無難に資産形成すれば良いか、元記事・コメントへの補足としてまとめました。中級者以上の方は読む必要が無い記事です。
※はてブコメントへの補足として書いたので、全然初心者向きじゃなかった。ということで、これを書いてる anond:20190601000848
基本は「eMAXIS Slim 全世界株式(オール・カントリー)をつみたてNISAや確定拠出年金で買う」
eMAXIS Slim 全世界株式(オール・カントリー)が参照する指標MSCI All Country World Indexは過去30年で年平均リターン7.3%なので4%は保守的な見積もり。一時的な下落は当然あって、標準偏差は15%程度。宝くじとの比較は論外。
と書いたけど、補足。
※元の記事書いた人とは別人です。わかりにくい書き方ですまない。
SBIグループ (住信SBIネット銀行・SBI証券) がおすすめ。ただし、UIは最悪。
個人的には楽天銀行が信用できない (連絡が無い、お願いした書類を送ってこないなど) のでSBIにしてる。
ちなみに、かつてはソフトバンクグループの一員だったが、現在は資本関係無し。禿嫌いな人も安心して使い給え。
確定拠出年金: 個人型確定拠出年金でサラリーマンの場合は月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の長所はリアルタイムで指数に対応した投資信託を購入でき、信託報酬が安めであること。短所は実際の指数との乖離が発生する (特に出来高が小さい場合、乖離率高めの傾向がある)、株式売買手数料がかかる場合があること、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%しか影響受けていないので。
eMAXIS Slim 全世界株式(オール・カントリー)かeMaxis Slimバランス (8資産均等型) を選んでおけば無難だけど、色々手を出したければ、基本はインデックスに連動するもの。
アクティブ投信は平均的には手数料分だけインデックスに負けるのでおすすめしない。
持ち家の満足感が高いことは知ってるから止めはしない。
でも、ローンで持ち家を買うということは、レバレッジをかけて単一の不動産に投資しているということを忘れずに。
id:kiwamaru100 家を買うのは資産形成といより家族への生命保険みたいなもんじゃない?死んだらローンなくなるし。
id:hanagesan ただし不動産に関しては団信による生命保険としての側面と住宅ローン減税の話がないのは不親切
確かに不親切でした。
ゴミ商品しか売りつけてこないよ。最近はさすがに変な仕組債を売りつけるようなことはしていないと思うけど。
付き合いなどがあってどうしてもという場合でも、信託報酬率が0.5%を超えたらアウト。購入時手数料がかかるものも論外。
一応国内債券の分類になるんだろうけど、その仕組み上中身が見えなくてリスクも高い。(そもそも借り手は銀行から融資を引けなかったところなので)
去年、みんなのクレジット、ラッキーバンクが詐欺まがいなことをやって大炎上した。
あれはギャンブル。
遊び程度にやるなら止めはしないけど。
TODO: 老後に書く
id:baca-aho-doji 銘柄はもうちょっと攻めても…と思うけど。
初心者が無難に積み立てる場合のアドバイスなので、中級者以上なら俺の最強ポートフォリオで資産配分しても良いですね。
自分の場合は、eMaxis Slimや購入・換金手数料なしシリーズで、米国株式・国内外REITを高めの比率で入れてます。あとは、米国ETFでセクタ投資。(VDE, VHT, VDC)
平均なのでそんな時期もあります。(場合によっては損失が出る) それがリスク資産なのです。
年末ガクッと下がったしね。
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
id:sewerrat 非課税のNISAで株以外の資産が入るバランスファンドを買うのは非効率でしかない。リバランスは保有資産全体で考えればいい話で、NISA枠内でリバランスする意味はない。
正論。きちんとリバランスできる人は、上でも書いたように債券クラスは課税口座に入れるべきですね。債券無しのバランスファンドが無いので、初心者向けのリバランス不要の投信としてオススメしてます!
id:bokukanochat ウェルスナビとかはどうなの偉い人
投資信託の信託報酬が年0.1%を目指す勝負をしている事態に、1%を払うのはもったいないと思ってる。
※個人の感想です
実際の投資においてあまり意味が無いというのはよく言われているけど、心理的にはすごく重要。大してデメリットも無いし、下落したり含み損が出ても「今月、来月と安く買える」と踏みとどまれるので。まあ、普通の人は積立していくことになるので、結局これになるんですけどね。
山崎元の本を買うといいよ。上にも書いたとおり国内株式の割合が高すぎると思うけど、投資のスタンスは間違いない。※個人の感想です
為替変動リスクは株式などと比べて小さいので、無視できるとまでは言わないまでも長期投資であればそれほど気にしなくても良いと思う。長期で見れば、様々な指標に織り込まれるし。
id:hineno7 手元にもうちょっと大きな金額(2000万くらい)あるときは、どうしたらいいか教えてほしい…。毎月チマチマ積み立てるのも、運用していない金が出てきて、もったいない気がしている
時期を分散したいということであれば、国内債券投信 (具体的にはeMaxis Slim国内債券) を買って取り崩していくのがよさそう。(時期を分散することにあまり意味は無いと言われているけど、安心して投資できることはとても重要)
ジャパンのトラディショナルな生命保険は資産形成に向いていないですね。予定利率が低すぎるし、満期前の解約返戻率がゴミなので。保険機能しかない掛け捨ての保険に入っておくのがベストだと思ってます。独身なら共済で十分で、共済によってはお安くスーツを作れたりするのでいいですよ。(都民共済スーツを愛用してる。)
生命保険料控除の枠が余ってるなら、明治安田生命の「じぶんの積立」に月5000円だけ加入しておくと、毎年1万円くらい税金がお得になります。(金額は人による。年末調整で紙を出すだけ) この保険は生命保険機能としてはゴミだけど、常に解約返戻率が100%以上になるし解約の制限も無く数日で換金できる、実質生命保険料控除でお得になるためだけの保険。ほぼ現預金と同じ扱いで良いけど、預金保護の対象では無い点に注意。
id:invoicekun 人気が出た金融商品のリターンは激減するという研究があるけど(ひふみ然り)、つまりはそういうことなのでは無いかと思う
その手の投資信託は基本的に中小の株式がリターンの源泉で、総資産額が増えるほど身動きが取りづらくなって (自身の売買で株価に影響が出やすいので) かつてのリターンが得られない状態になりがち。
一方、インデックス投信は中小株を大量に売買するという極端なことはやらないので、基本的にはそのような心配は不要です。
id:kyo_ju 学生時代からの知人がWeb上の日記で"手仕舞い"やら"建て玉"やらという言葉を日常的に使いだした時点でそっと縁切りしたぐらいの人間だし、株価で支えられてる政権と利害一致なんざ死んでも嫌なので手は出せんな。
ジャパンが嫌いなら、「eMaxis Slim 全世界株式 (除く日本)」あたりがおすすめだよ。
id:NOID2017 じぶんの積立、生命保険料控除にはいいけど若干面倒なのが面談必須なところ(2年前?くらいの情報なので変わってたらごめんなさい)
個別の債券はともかく、NOMURA-BPI総合に連動するような投信ならリーマンショックにほぼ影響されなかった実績がある Permalink | 記事への反応(16) | 21:55
ここは争わない。実際そうするべきだ
その労力すら無実無関係の男性には負う義理も義務もメリットもない。
とは言いつつ、さんざん書いてるぞ。不利益については。
「変わらないからオッケー」じゃないぞ。
だから受忍限度はそういうたぐいのものではない。そんくらい我慢せーよ、ということ。
無実無関係の男性には一切負担を強いられる義務も義理もないため、「そんくらい我慢せーよ」などと言われる謂れもない。
何様が「そんくらい」なんて決めてるんだ?
差別には「そんくらい」なんてない。
なぜ分かった。でもこれは言葉遊びではない。「差別」という言葉自身を悪になっていることによる議論の進まなさに辟易している。
「属性を理由に不利益を与えること」=「差別」なのだから、言い換えてるだけだろ。
言ってなくても行動で示してる。排除するとはそういうことだ。
「別の車両に乗れる」?ナンセンスだ。無関係の男性にはそもそも追い出されるべき理由がない。
https://anond.hatelabo.jp/20190519110033
のブコメに
todoリストを作れ。期限と優先順位を明記し、毎日更新しろ。大きな仕事の空き時間に細かい仕事をやれ。人に頼まなきゃいけないことは真っ先に頼め。メモ紙に書いてパソコンに貼っとけ。俺はそれでなんとかなった
とかあるが、
todoリスト→無能ゆえ問題が解決できない&先延ばしにしまくるためリストが膨大になり最終的に放棄される。
大きな仕事の空き時間に細かい仕事をやれ→発達には優先順位なんてつけられないから無理。
人に頼まなきゃいけないこと→発達だから人に頼むのにすごい労力を使う。
仕事の依頼をすると相手から「何言ってんのか意味わからない」といった顔をされるから、なんて説明したもんかすごい考えるけど
だったら自分でやったほうが早くねってなって結局自分のtodoに追加される。
上司にあれどうなったといわれて、なんか聞いたことあるなと思ってふと手元を見るとパソコンに張ってある。
なんだよな
つらい
10連休中ぼんやりを人生を振り返った。こういった要因でタイミングを逃したりズレてしまっている。
意識できないほど全力でやれば結果が出るが、良い意味でも悪い意味でも期待やプレッシャーがかかると勝率が下がる。
ストレスやプレッシャーから逃げてしまう。逃げ癖とも言われている。
今だ!ってタイミングで、気持ちが乗らない。だるい。天候や体調が悪い。また今度にしようか、先延ばしを考えてしまうが
こういう時こそがんばると後々やっといてよかったと思えることが多いので良いタイミングサインだと思ってやるようにしている。
急に退屈に耐えきれなくなったり、ゲームのことを急にフラッシュバックしてしまうと、ゲームが我慢できなくなってしまいゲームに手をつけてしまうと、日に日にプレイ時間が伸びてやめられなくなってしまう。
止めるためには、数日間ゲームに触れない。禁断症状はつらいが数日で消え失せる。
衝動的にならず、目的を決めてほどほどにやれればいいのだが。今できていない。
この3点だろうか
「人間に似た外見を持つ人工的なものがまるで人間のように振る舞おうとする姿」が好きだ。
有名どころだとスター・ウォーズにおけるC-3POだったりL3-37(泣いた)だったり。
HUGっと!プリキュアのルールー・アムール/キュアアムールはアンドロイドでありながらプリキュアに変身することができた。泣いた。
この前たまたま日本科学未来館に行く機会があって、全くノーチェックだったけどオトナロイドとオルタを見た。オトナロイドは椅子に座った女性型遠隔操作ロボットで、声は実際の人間をボイチェンで出してるだけ。オルタは上半身だけ、しかも半分機械がむき出しで、センサーによって前を通る人とかを認識して顔や手が動くけどそこまでインタラクティブ感はない。でも泣いた。
もう10年以上前になるけど初音ミクの登場も衝撃的だった。イラストがついたシンセサイザーが自分自身や愛や有象無象を歌っている。泣いた。(Todo: 週末はM3とニコニコ超会議に行くぞ)
で、
いわゆる四天王とかそういう呼び名があるのは知ってる。その人達の動画はそれぞれ数個見た。親分はたぶん10個くらい見た。
でもそれ以上なかなか続かない。
これまでの自分の趣味から理論的に(?)考えると絶対ハマりそうなのに、ちょっと動画見ただけで満足というか、もうこれ以上はいいかな...と思ってしまう。
自分は未だVTuberというものに対する本質的な何かを見抜けてないのか。もしかして自分に刺さるVTuber(、が誰だかわからないけど)を見つけてないだけなのか。もどかしい。
就活終えたのでまとめとして自分が何したかを書いてみたけど投げるところもないのでこちらへ。
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書くにあたって文字数が数えられないのと文章校正機能がないところ。
彼はそろそろ結婚を考えており、条件が近い私に生活に必要なもの&ことを聞きたいそうだ。
都内で社会人数年目、結婚2年目の20代後半。子なし、共働き。2人ともIT系会社員。
自分たちの基準としては2DK以上。細かい条件は2階以上とか、洗面所独立とか。こういった条件はお互い出し合いつつ、スーモやホームズを見ながら少しずつ固めていった。
間取り図を見て家具配置を考えたところ、40平方メートル以上が条件に加わったりもした。
あとはお互いの職場からの距離と、予算で最寄り駅を決めて、数件の物件を内見し決定。
このあたりは普通の決め方だと思っている。
2DKで、ダイニング、寝室、作業部屋(机と本棚)みたいな構成になっている。
現状の反省点としては、使わない部屋ができていることだ。ダイニングにテーブルとTVを置いてあり、テーブルで作業したりご飯を食べているので作業部屋とは言ったが実質物置部屋だ。
大きいものは、TV、冷蔵庫、電子レンジ、トースター、炊飯器、ガステーブル、ポット、テーブル、棚類、空気清浄機、洗濯機、布団乾燥機
こだわった点は以下。
良かったのは、布団乾燥機で暖かい布団は冬最高なこと。また、ドラム式もきっちり乾くので平日日中に動かして、帰宅後に取り出している。
反省点としては、オーブントースターが便利なのでそこまでオーブン機能を使わないところと、冷蔵庫は350Lだと少し小さいと感じている点。
食洗機はまだ導入できていない。キッチンが狭いので置くところがない…
あとは最近自動調理鍋がほしい。共働きだと煮込む時間取りにくくない?
基本的には半分ずつだが、きっちり半分にしていない&妻のほうが気が利くので相当負担させてしまっている。この辺は反省点であり、できる限り自分からやるように心がけている。
見える化のために付箋によるカンバン方式を家事全般に導入検討中(後述)。
食事については、ご飯や味噌汁は用意している。メインは気が向いたときだけ作り、基本はスーパーのお惣菜。
昼は各自社食があるし、朝はグラノーラかパン。妻が早く起きると目玉焼きを焼いてくれるので好き。
土日はネットで気になった料理に挑戦してみたり、外食に行ったりする。
やっていること
うまく行っているのはTodo管理アプリとファイル共有。Todo管理では、洗剤や醤油、食べたいものなど何でも入れておき、帰宅時にどちらかが消化する。粒度を揃えたりせず、ざっくばらんに入れることで長続きしていると思う。
ファイル共有は主に購入したい家電と今住んでいる家を決定するときの比較表や、家計簿的なものが詰まっている。買ったときの所感が残っていると数年後の買い替え/住み替えに便利…と信じている。
うまく回っていないのはGoogleカレンダー。お互いそんなに出かけないので、把握できる量の予定しかなかったため自然と使わなくなった。仕事で遅い日は連絡とり合っているので問題なかったりする。もう少し複雑になってくるともっと必要になるのかも。
家事用カンバン付箋だが、これは最近始めたのだが割とうまく回り始めた(と思っている)。現在は大物(週1の風呂掃除など)を貼っておき、やったら剥がしていく。土日に何を片付けたかがわかりやすくなり、モチベーションも保ちやすい。
今後は1週間分の家事を付箋にしておくように拡張予定である。これにより、お互いどれくらい家事をやったか見える化が可能で、よく気が利く妻が負担していた家事を半々に持っていきたい。
あくまで私の家の現在の方法をまとめたわけで、今後子どもができたりするとまた変わっていくと思う。
1年に1回はこういう振り返りをして、改良策を出していきたい。
// 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(&amp;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(&amp;msg, NULL, 0, 0, PM_REMOVE)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;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, &amp;ps); this->OnPaint(ps); EndPaint(hWnd, &amp;ps); ::UpdateWindow(hWnd); RECT Rect2 = { 0,0,48*9,48 * 100 }; InvalidateRect(hWnd, &amp;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, &amp;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, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;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, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;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, &amp;Rect, hBrush); //Rect.left += width; //Rect.right += width; Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;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 &amp;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, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;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; }
テトリス風
落ちてくるブロックの描き方
まずはブロックの種類は3種類
の違いをよく見比べて
自力で違いがわかれば
プログラマーにはなれるとおもう
とはいえ、コレを自力でわかるならもっと儲かる仕事あるとはおもうけどな
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(&amp;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(&amp;msg, NULL, 0, 0, PM_REMOVE)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;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, &amp;ps); this->OnPaint(ps); EndPaint(hWnd, &amp;ps); ::UpdateWindow(hWnd); RECT Rect2 = { 0,0,48*9,48 * 8 }; InvalidateRect(hWnd, &amp;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, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;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, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;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, &amp;Rect, hBrush); //Rect.left += width; //Rect.right += width; Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;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, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;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; }
第何回だろうな
まだ、何を押してもブロックが右に移動するだけ(右端にいくと左にワープ)
// 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(&amp;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(&amp;msg, NULL, 0, 0, PM_REMOVE)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;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, &amp;ps); this->OnPaint(ps); EndPaint(hWnd, &amp;ps); ::UpdateWindow(hWnd); RECT Rect2 = { 0,0,48*9,48 * 8 }; InvalidateRect(hWnd, &amp;Rect2, TRUE); } else if (obj == WAIT_FAILED) { rc = GetLastError(); } else { } } return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;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, &amp;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, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;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; }
// 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(&amp;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(&amp;msg, NULL, 0, 0, PM_REMOVE)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;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, &amp;ps); this->OnPaint(ps); EndPaint(hWnd, &amp;ps); ::UpdateWindow(hWnd); RECT Rect2 = { 0,0,48,48 * 8 }; InvalidateRect(hWnd, &amp;Rect2, TRUE); } else if (obj == WAIT_FAILED) { rc = GetLastError(); } else { } } return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;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, &amp;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, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;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; }
青い■を表示するだけ
// 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(&amp;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(&amp;msg, nullptr, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;msg); } } return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;ps) { HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); RECT Rect = { 0,0,48,48 }; BOOL ret = FillRect(ps.hdc, &amp;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, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;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; }
実質このtargetがthisポインタ相当になって
this->OnPaintと呼ぶのと同じ効果を出してくれる
これがグローバル関数からクラスメソッドの基本的な呼び方になる
case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;ps); }
// 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(&amp;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(&amp;msg, nullptr, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;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, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;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; }
// 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(&amp;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(&amp;msg, nullptr, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;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, &amp;ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;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; }
こんなかんじ。クラス化した